我尝试加载一个FXML,并使用Java代码(而不是使用FXML标记)设置控制器。我在FXML中有不同的字段。我尝试加载(例如文本字段、按钮...)。
下面是一个例子:
Tab tab = new Tab();
tab.setText("TesetTabAdd");
tabpane.getTabs().add(tab);
FXMLLoader loader = new FXMLLoader(getClass().getResource("tab.fxml"));
TabController tabCont = new TabController();
tabCont.setName("Sandro");
loader.setController(tabCont);
try {
tab.setContent((Node)loader.load(getClass().getResource("tab.fxml")));
} catch (IOException ex) {
System.out.println(ex);
}
如您所见,我创建了一个新的选项卡,为它设置文本,将它添加到tabpane,加载fxml,然后创建一个新的控制器,并将其设置为fxml的控制器。之后,我尝试在初始化之前在fxml中设置一个值,以便在控制器中使用它来更新文本字段或按钮。
这是我的控制器,我试图设置:
public class TabController implements Initializable {
@FXML private TextField name;
private final StringProperty nameProp = new SimpleStringProperty();
public String getNameProp() {
return nameProp.get();
}
public void setNameProp(String value) {
nameProp.set(value);
}
public StringProperty namePropProperty() {
return nameProp;
}
public void setName(String name){
nameProp.setValue(name);
}
public String getName(){
return nameProp.get();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
name.textProperty().bind(nameProp);
}
}
我对createTab()方法进行了一小段编辑。这里我设置了控制器,然后使用setName方法。但是textfield不显示任何内容。system.out.println(tabcont.getname());
方法打印出“sandro”!!!
public void createTab(){
try{
Tab tab = new Tab();
tab.setText("TesetTabAdd");
tabpane.getTabs().add(tab);
FXMLLoader loader = new FXMLLoader();
TabController tabCont = new TabController();
loader.setController(tabCont);
tabCont.setName("Sandro");
tab.setContent((Node)loader.load(getClass().getResource("tab.fxml")));
System.out.println(tabCont.getName());
} catch (IOException ex) {
System.out.println(ex);
}
}
1)在调用load()
方法之前,不会加载FXML文件。
(按照您的注释“...load the FXML,然后我创建一个新的控制器...
”)。因此,仅仅启动FXMLLoader不会加载给定的FXML文件。
2)您调用了错误的加载方法。您应该使用实例化的FXMLLoader的加载方法。但您使用的是FXMLLoader类的静态加载方法。此静态版本将忽略通过setController()
设置的控制器类。请尝试:
FXMLLoader loader = new FXMLLoader(getClass().getResource("tab.fxml"));
TabController tabCont = new TabController();
tabCont.setName("Sandro");
loader.setController(tabCont);
try {
tab.setContent((Node) loader.load());
} catch (IOException ex) {
System.out.println(ex);
}
问题内容: 我的课看起来像这样: 在FXMLLoader创建相应的控制器(在所给出的实例经由文件通过调用第一默认构造,然后)方法: 输出为: 那么,为什么存在这种方法呢?使用构造函数或方法初始化控制器所需的东西有什么区别? 问题答案: 简而言之:首先调用构造函数,然后@FXML填充所有带注释的字段,然后再调用。因此,构造函数无权访问引用文件中定义的组件的字段,而有权访问它们。 引用FXML简介:
我的类如下所示: 通过首先调用默认构造函数,然后调用方法,创建相应控制器的实例(在文件中通过给出): 输出为: 那么,为什么方法会存在呢?使用构造函数或方法初始化控制器所需的东西有什么区别? 谢谢你的建议!
我想从我的控制器类中处理阶段事件(即隐藏)。所以我所要做的就是添加一个这样的侦听器: 但问题是初始化在该代码之后立即开始: 在此代码之前: 因此,getScene返回null。 我自己找到的唯一解决方法是将侦听器添加到,当它变得不为空时,我得到场景,将我最终检索阶段的侦听器处理添加到它的中。这一切都以将所需的侦听器设置为阶段事件而结束。 我觉得听众太多了。 这是解决我问题的唯一方法吗?
正如标题所述,在构建表并将所有内容添加到表中的initialize方法和FXMLLoader之间存在一定的冲突,FXMLLoader应该为弹出窗口加载FXML。 我的代码: 主要内容: FXML 1。 控制器。 Fxml2: 问题是:如果你删除初始化或注释它-Neu按钮弹出-工作,如果没有-表格显示,但按钮弹出没有,似乎有冲突
我看了这个,这个,还有这个,但遗憾的是,没有一个能解决我的问题。组件总是空的。ID是一样的,但我仍然不知道我做错了什么。下面是我的代码: 应用类。 RootView.fxml 控制器类 应用程序运行正常。我错过了什么吗?
我有一个Spring MVC,它使用一个外部库,我无法访问代码。此外部库使用标准system.get属性调用读取某些属性。我必须在使用服务之前设置这些值。 由于我的应用程序是SpringMVC应用程序,我不确定如何初始化这些属性。这是我到目前为止所做的,但由于某些原因,我认为这些值总是空的。 我将属性放在属性文件 然后,我在我的应用程序中添加了以下两行ontext.xml 我阅读了文档,为了设置初