访问父控制器中加载的 FXML 的元素
Posted
技术标签:
【中文标题】访问父控制器中加载的 FXML 的元素【英文标题】:Access elements of loaded FXML in Parent Controller 【发布时间】:2015-02-10 12:55:17 【问题描述】:我目前有以下情况:
我创建了一个由 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 的元素吗?
【问题讨论】:
它应该可以工作,尽管让同一个对象充当两个不同 FXML 文件的控制器是一种不寻常的设置。检查您是否正确设置了fx:id
(如有必要,发布该部分 FXML)。还要检查它是否真的是someChildTextField
,即null
。
我应该只创建单独的控制器吗?
另一方面,我仍然无法正常工作。我已经正确设置了fx:id
,它确实是someChildTextField
,即null
。
【参考方案1】:
我看不出您的方法不起作用的任何原因;我嘲笑了类似的东西,它工作得很好。不过,这是一种不寻常的方法,因为您将同一对象用作两个单独的 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,我也不知道为什么它不起作用。我现在将使用单独的控制器,因为我可以看到它要好得多。以上是关于访问父控制器中加载的 FXML 的元素的主要内容,如果未能解决你的问题,请参考以下文章
我在应用程序委托中加载的视图控制器(在导航控制器中)与标签栏重叠