JavaFX包含相同的控制器实例

时间:2016-05-21 20:40:02

标签: java javafx include fxml

我有一个JavaFX项目,其视图用FXML编写并附加到Controller。在这个控制器中,我有一个重物,几乎在每个用户交互中使用。

我的观点有一个具有不同功能的TabPane。我的问题是FXML文件非常大,我想分成不同的子文件(每个选项卡都会得到一个)。我尝试使用fx:include

我遇到的问题是我必须将这些文件附加到控制器,因此我使用fx:controller附加它们。问题是该语句创建了一个新的控制器实例,因此我无权访问共享对象。

我有什么办法可以使用同一个控制器和fx:include吗?

1 个答案:

答案 0 :(得分:1)

单控制器

如果您真的需要一个控制器用于所有选项卡,您可以考虑采用编程方法。您可以手动初始化视图并将它们链接到控制器实例。您可以创建以下帮助器方法并随后为每个视图调用它(例如:loadAndLink(controller, "/com/ui/views/login.fxml")

public void loadAndLink(Object controller, String viewPath) {
    FXMLLoader loader = new FXMLLoader(getClass().getResource(viewPath));
    loader.setController(controller);
    try {
        loader.load();
    } catch (IOException e) {
        // ...
    }
}

请记住,将为每个视图调用控制器的initialize(...)方法(在loader.setController(controller)调用上),因此您希望它是幂等的。此外,在程序加载FXML的情况下,您需要从中删除fx:controller标记。并确保所有视图中所有元素的fx:id都具有唯一值。

嵌套控制器

另一方面,如果您的FXML文件非常大,那么控制器也可能是。考虑为每个选项卡使用单独的嵌套控制器(此fx:include的用途)。如果您设置嵌套控制器fx:id

,则可以从父控制器链接到嵌套控制器

家长FXML:

...
<fx:include fx:id="embeddedView" source="SomeOtherView.fxml"/>
...

家长控制器:

...
@FXML
private Parent embeddedView;
...