【发布时间】:2013-07-28 23:54:54
【问题描述】:
我创建了一个根 FXML,它是一个 BorderPane,它有自己的根控制器。 我想动态地将 FXML 添加到此边框的中心。
这些 fxml 中的每一个都共享同一个控制器,即根控制器。我在 netbeans 中通过在创建空 FXML 文件时选择现有控制器来完成此操作。
我也给了节点不同的 id 名称,但是根控制器无法识别这些 fxml 中的节点。
是否可以为不同的 fxml 共享同一个控制器?
提前致谢
【问题讨论】:
我创建了一个根 FXML,它是一个 BorderPane,它有自己的根控制器。 我想动态地将 FXML 添加到此边框的中心。
这些 fxml 中的每一个都共享同一个控制器,即根控制器。我在 netbeans 中通过在创建空 FXML 文件时选择现有控制器来完成此操作。
我也给了节点不同的 id 名称,但是根控制器无法识别这些 fxml 中的节点。
是否可以为不同的 fxml 共享同一个控制器?
提前致谢
【问题讨论】:
背景
我不知道是否真的推荐共享控制器实例,至少我以前从未见过这样做。
即使您在要加载的每个 fxml 中将控制器类设置为相同的值,它也不会共享相同的控制器实例,因为每次加载控制器时,它都会创建一个新实例(对象)的控制器类(这似乎不是你想要的)。
可能的解决方案
我没有尝试过这两种解决方案,但相信它们会奏效。
initialize 方法可能会在您每次加载新的 fxml 文件时被调用。因此,您需要通过初始化 idempotent 在您的逻辑中考虑这一点。
A.手动设置控制器实例。
手动创建控制器类的实例。
MyController controller = new MyController();
在加载每个 fxml 之前将控制器设置为您的控制器实例。
FXMLLoader loader = new FXMLLoader();
loader.setController(controller);
Panel panel = (Panel) loader.load("myfxml.fxml");
对每个 fxml 文件重复第 3 步,每次使用相同的控制器引用。
B.使用控制器工厂。
您可以在您的 fxml 加载器上 set a controller factory 并让控制器工厂始终返回相同的控制器实例。
【讨论】: