bas*_*aad 3 javafx fxml javafx-8 fxmlloader
我目前有以下情况:
我创建了一个由FXML控制器备份的FXML文件.屏幕由侧边栏和儿童托架组成.当我单击侧边栏中的元素时,我在子容器中加载了一个额外的FXML文件,如下所示:
childHolder.getChildren().addAll(FXMLLoader.load(getClass().getResource("SidebarItem1.fxml")));
Run Code Online (Sandbox Code Playgroud)
这很好用.但是我想在父控制器的控制器中访问加载的FXML的一些元素.我刚加载后,我刚刚初始化了子FXML的元素.
我已经看过这个问题:JAVAFX - FXML - 从父控制器访问加载的FXML控件,但是当我这样做时,我仍然会收到错误:
FXMLLoader loader = new FXMLLoader(getClass().getResource("SidebarItem1.fxml"));
loader.setController(this);
childHolder.getChildren().addAll(loader.load());
someChildTextField.setText("Some text");
Run Code Online (Sandbox Code Playgroud)
我给someChildTextField了一个fx:id,我把它放在初始化的顶部,如下所示:
@FXML public TextField someChildTextField;
Run Code Online (Sandbox Code Playgroud)
不过,我得到一个NullpointerException,所以我认为它仍然无法找到控件.
有谁知道如何在父控制器中访问加载的FXML的元素?
我看不出你的方法不起作用的任何理由; 我嘲笑类似的东西,它工作得很好.但这是一种不寻常的方法,因为您使用相同的对象作为两个单独的FXML文件的控制器.
我建议为每个FXML使用一个控制器.所以你可以做点什么
public class SidebarItem1Controller {
@FXML
private TextField someTextField ;
public void setText(String text) {
someTextField.setText(text);
}
}
Run Code Online (Sandbox Code Playgroud)
然后从你的父控制器做起
FXMLLoader loader = new FXMLLoader(getClass().getResource("SidebarItem1.fxml"));
childHolder.getChildren().add(loader.load());
SideBarItem1Controller childController = loader.getController();
childController.setText("Some Text");
Run Code Online (Sandbox Code Playgroud)
用常规方法在SideBarItem1.fxml文件中设置控制器 fx:controller = com.example.SidebarItem1Controller"