gpt4 book ai didi

JavaFX 包含相同的 Controller 实例

转载 作者:行者123 更新时间:2023-12-01 09:54:13 26 4
gpt4 key购买 nike

我有一个 JavaFX 项目,其中的 View 用 FXML 编写并附加到 Controller 。在这个 Controller 中,我有一个重物,几乎在每个用户交互中都会使用它。

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

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

有什么办法我仍然可以使用相同的 Controller 和 fx:include 吗?

最佳答案

单 Controller

如果您确实需要为所有选项卡使用一个 Controller ,您可以考虑采用编程方法。您可以手动初始化 View 并将它们链接到 Controller 实例。您可以创建以下辅助方法并随后为每个 View 调用它(例如: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) {
// ...
}
}

请记住,将为每个 View 调用 Controller 的 initialize(...) 方法(在 loader.setController(controller) 调用上) ,所以你会希望它是幂等的。此外,如果以编程方式加载 FXML,您需要从中删除 fx:controller 标签。还要确保所有 View 中所有元素的 fx:id 具有唯一值。

嵌套 Controller

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

,则可以从父级 Controller 获得指向嵌套 Controller 的链接

父 FXML:

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

父 Controller :

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

关于JavaFX 包含相同的 Controller 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37367753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com