我目前有以下情况:
我创建了一个由FXML控制器备份的FXML文件。屏幕由侧边栏和儿童托架组成。当我单击侧边栏中的元素时,我在子容器中加载了一个额外的FXML文件,如下所示:
childHolder.getChildren().addAll(FXMLLoader.load(getClass().getResource("SidebarItem1.fxml")));
这很好用。但是我想在父控制器的控制器中访问加载的FXML的一些元素。我刚刚加载后,我刚刚初始化了子FXML的元素。
我已经看过这个问题:JAVAFX - FXML - Access Loaded FXML Controls from Parent Controller,但是当我这样做时,我仍然会收到错误:
FXMLLoader loader = new FXMLLoader(getClass().getResource("SidebarItem1.fxml"));
loader.setController(this);
childHolder.getChildren().addAll(loader.load());
someChildTextField.setText("Some text");
我已经someChildTextField
给了fx:id
,我把它置于初始化之上,如下所示:
@FXML public TextField someChildTextField;
但是,我得到一个NullpointerException,所以我认为它仍然无法找到控件。
有没有人知道如何在父控制器中访问加载的FXML的元素?
答案 0 :(得分:6)
我无法理解你的方法不起作用的原因;我嘲笑类似的东西,它工作得很好。但这是一种不寻常的方法,因为您使用相同的对象作为两个单独的FXML文件的控制器。
我建议为每个FXML使用一个控制器。所以你可以做类似
的事情public class SidebarItem1Controller {
@FXML
private TextField someTextField ;
public void setText(String text) {
someTextField.setText(text);
}
}
然后从您的父控制器执行
FXMLLoader loader = new FXMLLoader(getClass().getResource("SidebarItem1.fxml"));
childHolder.getChildren().add(loader.load());
SideBarItem1Controller childController = loader.getController();
childController.setText("Some Text");
使用fx:controller = com.example.SidebarItem1Controller"