我创建了一个根 FXML,它是一个 BorderPane,它有自己的根控制器。我想动态地将 FXML 添加到此边框的中心。
这些 fxml 中的每一个都共享相同的控制器,即根控制器。我在 netbeans 中通过在创建空 FXML 文件时选择现有控制器来完成此操作。
我也给了节点不同的 id 名称,但根控制器无法识别这些 fxml 中的节点。
是否可以为不同的 fxml 共享相同的控制器?
提前致谢
背景
我不知道是否真的推荐共享控制器实例,至少我以前从未见过这样做过。
即使您将要加载的每个 fxml 中的控制器类设置为相同的值,它也不会共享相同的控制器实例,因为每次加载控制器时,它都会创建一个新的实例(对象)控制器类(这似乎不是你想要的)。
潜在的解决方案
我没有尝试过这两种解决方案,但相信它们会起作用。
每次加载新的 fxml 文件时,可能都会调用 initialize 方法。因此,您将希望通过使 initialize 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 加载器上设置控制器工厂,并让控制器工厂始终返回相同的控制器实例。