我是JavaFX 2.2的新手,到目前为止,我找不到在JavaFX 2.2应用程序中显示SVG图像的方法.我看了看Batik,但它没有为我做伎俩,因为它转换为BufferedImages而不是javafx.ImageView.
有没有办法在JavaFX应用程序中显示SVG图像?或者你至少可以从JavaFX导出SVG图像?该功能是否Node.snapshot()以任何方式帮助那里?
在这个 tutotial中,是一个如何包含自定义组件并使用来自容器控制器的控制器的示例.
main_window_content.fxml
<VBox fx:controller="com.foo.MainController">
<fx:include fx:id="dialog" source="dialog.fxml"/>
...
</VBox>
Run Code Online (Sandbox Code Playgroud)
MainController.java
public class MainController extends Controller {
@FXML private Window dialog;
@FXML private DialogController dialogController;
..
Run Code Online (Sandbox Code Playgroud)
如果组件只包含一次,它可以正常工作.如果包含两次相同的组件,则不会初始化控制器.两个控制器都为空.
main_window_content.fxml
<VBox fx:controller="com.foo.MainController">
<fx:include fx:id="dialog1" source="dialog.fxml"/>
<fx:include fx:id="dialog2" source="dialog.fxml"/>
...
</VBox>
Run Code Online (Sandbox Code Playgroud)
MainController.java
public class MainController extends Controller {
@FXML private Window dialog1;
@FXML private DialogController dialogController1;
@FXML private Window dialog2;
@FXML private DialogController dialogController2;
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决问题吗?谢谢
这是我的FXML加载代码.它在主应用程序中执行:
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("main_window_content.fxml"));
stage.setTitle("FXML Welcome");
stage.setScene(new Scene(root, 300, …Run Code Online (Sandbox Code Playgroud) 我有一组按钮:
VBox menuButtons = new VBox();
menuButtons.getChildren().addAll(addButton, editButton, exitButton);
Run Code Online (Sandbox Code Playgroud)
我想在这些按钮之间添加一些间距,而不使用CSS表.我认为应该有办法解决这个问题.
setPadding(); 是为了盒子里的按钮.setMargin(); 应该是Box本身.但我没有找到按钮间距的方法.
任何想法我都很高兴.:)
我在SceneBuilder中为我的JavaFX应用程序创建了一个视图.我希望我的观点最大化.如何在SceneBuilder或.fxml文件中实现此目的?
我最近升级到Windows 10,在Windows 8.1中运行的JavaFX代码似乎在10中冻结.我已经跟踪了在对话框中打开ComboBox的问题.这似乎冻结了任何JavaFX程序.还有其他人有同样的问题吗?(Windows 10计算机仍然很少,所以很好地确认bug确实是JavaFX问题)
我在下面附上了示例代码.主阶段的ComboBox很好但是当我打开一个对话框并尝试在那里使用ComboBox时,整个事情就会冻结.我在Eclipse 4.4.0中使用Java 8u51
package javafxExamples;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceDialog;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class ComboErrorTest extends Application {
String[] list={"Jamie", "Arthur", "Gordon"};
private Stage stage;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
//create box in main stage.
ComboBox<String> comboBox=new ComboBox<String>();
for (int i=0; i<list.length; i++){
comboBox.getItems().add(list[i]);
}
comboBox.getSelectionModel().select(list[0]);
BorderPane pane = new BorderPane(comboBox);
pane.setPrefSize(400, …Run Code Online (Sandbox Code Playgroud) 脚本
我正在创建一个GUI,其中多个视图引用相同的模型对象.
我习惯了什么
在Swing中,如果我希望所有视图都引用相同的模型,我会将模型传递给构造函数.
我目前正在做什么
在JavaFX中,我通过在每个视图/控制器加载后在视图/控制器(菜单栏,拆分窗格,制表符......)中设置setter方法来传递模型.我发现这非常俗气和笨重.另外,我发现它不起作用,因为在某些情况下我需要在初始化某些控制器小部件之前模型已经存在于控制器中.
Lackluster Alternatives
(注意:我正在引用这些stackoverflow问题:
依赖注入
将模型对象保存为公共静态变量
将参数从调用者传递到控制器
我希望每个控制器在其构造函数中加载自身,并且我希望每个自定义控制器自动注入其父控制器.例如,卡片概述选项卡会像这样加载自身:
public CardOverviewTab() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("card_overview_tab.fxml"));
fxmlLoader.setRoot(content);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)并且SingleGameSetup控制器将卡概述选项卡自动注入变量:
public class SingleGameSetupController extends AnchorPane {
@FXML private CardOverviewTab cardOverviewTab;
// Rest of the class
}
Run Code Online (Sandbox Code Playgroud)包含卡片概述选项卡的fxml部分如下所示:
<CardOverviewTab fx:id="cardOverviewTab" />
Run Code Online (Sandbox Code Playgroud)这样我不需要担心手动加载控制器,但我仍然有设置模型的问题.
在FXMLLoader上设置控制器
活动巴士
独生子
我在寻找什么
有没有办法以不那么繁琐的方式传递模型对象?我正在寻找一种简单的方法,如将模型传递给构造函数,但我不想处理通过FXMLLoader手动加载控制器,或者在加载控制器后设置模型.也许有一个类来检索模型是最好的选择,但我要求以防万一有更好的方法.
我目前在一个屏幕上有两个tableview,这导致两个TableView都有用户可以选择的行.
现在我只希望同时选择一行(与从中选择哪个TableView无关).我正在考虑某种类型的侦听器,当选择一行时,该侦听器会取消选择另一行.这是我最初的设置:
步骤1
搜索将方法绑定到行选择的方法(没有类似的东西tableview.setOnRowSelected(method))
步骤2 创建一个类似于一种监听器的方法:当选择一行时,取消选择另一行(我知道如何做这部分)
Class1 selectedObject1 = (Class1)tableview1.getSelectionModel().getSelectedItem();
Class2 selectedObject2 = (Class2)tableview2.getSelectionModel().getSelectedItem();
if(selectedObject1 != null && selectedObject2 != null) {
tableview1.getSelectionModel().clearSelection();
}
Run Code Online (Sandbox Code Playgroud)
所以,第一步就是问题所在.我想到了一个可以在其上创建监听器的可观察列表,然后将所选行添加到列表中.发生这种情况时,侦听器可以调用该方法.任何人都知道如何制作这个?
任何帮助是极大的赞赏.
我正在javafx中构建一个简单的应用程序,我希望能够为FlowPane添加边框.
我在java中比javafx有更多的经验,所以我试图找到相当于.setBorder(BorderFactory.createEmptyBorder(0,0,0,0))但无济于事.
不幸的是,我发现的一切似乎都比我需要的更复杂.我不需要样式或短划线,这就是我所发现的.
谢谢 !
我正在研究JavaFX应用程序.我的所有gui都是.fxml格式化的,通过控制器类来管理所有GUI组件.但是,在加载FXML加载器之前,我在实例化控制器类时遇到了困难.我无法从stackoverflow上的其他人那里找到一个很好的解决方案,因此这不是一个重复的问题.
我实例化控制器类的原因是我想传递一些参数,以便这些参数将显示在GUI中.
我按以下方式加载FXML文件:
/*
* for Work Order button
*/
@FXML
private void pressWorkOrder() throws Exception{
WorkOrderController wo = new WorkOrderController("ashdkjhsahd"); //instantiating constructor
Parent parent = FXMLLoader.load(getClass().getResource("/fxml/WorkOrder.fxml"));
Scene scene = new Scene(parent);
Stage stage = new Stage();
stage.setScene(scene);
stage.setTitle("Word Order");
stage.setResizable(false);
stage.show();
}
Run Code Online (Sandbox Code Playgroud)
这是我的实际Controller类:
public class WorkOrderController implements Initializable{
@FXML
private Button summary;
private String m,n;
public WorkOrderController(String str) {
// TODO Auto-generated constructor stub
m = str;
}
//for testing
public void set(String …Run Code Online (Sandbox Code Playgroud) 我对Java,JavaFX和一般的编程有点新意,我有一个问题正在打破我的大脑.
在大多数关于填充ListView的教程中(更具体地说,使用ObservableArrayList),最简单的方法是从字符串的ObservableList中创建它,如下所示:
ObservableList<String> wordsList = FXCollections.observableArrayList("First word","Second word", "Third word", "Etc.");
ListView<String> listViewOfStrings = new ListView<>(wordsList);
Run Code Online (Sandbox Code Playgroud)
但我不想使用字符串.我想使用一个名为Words的自定义对象:
ObservableList<Word> wordsList = FXCollections.observableArrayList();
wordsList.add(new Word("First Word", "Definition of First Word");
wordsList.add(new Word("Second Word", "Definition of Second Word");
wordsList.add(new Word("Third Word", "Definition of Third Word");
ListView<Word> listViewOfWords = new ListView<>(wordsList);
Run Code Online (Sandbox Code Playgroud)
每个Word对象只有2个属性:wordString(单词的一个字符串)和definition(另一个字符串,即单词的定义).我两个都有吸气剂和二传手.
您可以看到它的位置 - 代码编译和工作,但是当我在我的应用程序中显示它时,它不会显示ListView中每个单词的标题,而是将Word对象本身显示为字符串!
我的问题是,具体来说,有一种简单的方法可以重写这个:
ListView<Word> listViewOfWords = new ListView<>(wordsList);
Run Code Online (Sandbox Code Playgroud)
这样一来,它不是直接从wordsList中获取Words,而是访问我的observableArrayList的每个Word中的wordString属性?
为了清楚起见,这不适用于android,并且最终将更改,保存和加载单词列表,因此我不能只创建另一个数组来保存wordStrings.我在网上做了一些研究,似乎有一个名为'Cell Factories'的东西,但对于看起来如此简单的问题似乎不必要的复杂,正如我之前所说,我有点编程方面的新手.
有人可以帮忙吗?这是我第一次来这里,所以如果我没有包含足够的代码或者我做错了,我很抱歉.