我有一个JavaFX项目,其视图用FXML编写并附加到Controller。在这个控制器中,我有一个重物,几乎在每个用户交互中使用。
我的观点有一个具有不同功能的TabPane。我的问题是FXML文件非常大,我想分成不同的子文件(每个选项卡都会得到一个)。我尝试使用fx:include
。
我遇到的问题是我必须将这些文件附加到控制器,因此我使用fx:controller
附加它们。问题是该语句创建了一个新的控制器实例,因此我无权访问共享对象。
我有什么办法可以使用同一个控制器和fx:include
吗?
答案 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;
...