访问父控制器中加载的FXML的元素

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的元素?

Jam*_*s_D 6

我看不出你的方法不起作用的任何理由; 我嘲笑类似的东西,它工作得很好.但这是一种不寻常的方法,因为您使用相同的对象作为两个单独的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"