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

3

我目前的情况如下:

我创建了一个由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的情况,因此我认为它仍然无法找到控件。

有人知道如何在父Controller中访问加载的FXML元素吗?


虽然将同一对象作为两个不同FXML文件的控制器是不寻常的设置,但它应该能够正常工作。请检查您是否正确设置了fx:id(如果需要,请发布FXML的部分内容)。还要检查确实是someChildTextField为空。 - James_D
我应该创建单独的控制器吗? - bashoogzaad
另一方面,我仍然无法使其工作。我已经正确设置了fx:id,但实际上是someChildTextField为空。 - bashoogzaad
1个回答

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");

在您的SideBarItem1.fxml文件中,按照通常的方式设置控制器,即fx:controller = com.example.SidebarItem1Controller

谢谢你的建议James_D,我还不知道为什么它不起作用。我现在会使用单独的控制器,因为我可以看到这样做更好。 - bashoogzaad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接