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

时间:2014-12-11 21:50:01

标签: javafx javafx-8 fxml fxmlloader

我目前有以下情况:

我创建了一个由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的元素?

1 个答案:

答案 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"

以常规方式在SideBarItem1.fxml文件中设置控制器