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,所以我认为它仍然找不到控件。

有谁知道如何访问父控制器中加载的 FXML 的元素?

4

1 回答 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"

于 2014-12-12T14:58:18.107 回答