我尝试加载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);
}
如您所见,我创建了一个新Tab,为其设置文本,将其添加到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方法。但我文本字段不显示任何东西。 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);
}
}
答案 0 :(得分:3)
1)在调用load()
方法之前,不会加载FXML文件
(根据你的评论“... load the fxml and then I create a new controller ...
”)。因此,只需启动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);
}