我创建了一个根 FXML,它是一个 BorderPane,它有自己的根 Controller 。
我想动态地将 FXML 添加到此边框的中心。
这些 fxml 中的每一个都共享相同的 Controller ,即根 Controller 。我在 netbeans 中通过在创建空的 FXML 文件时选择一个现有的 Controller 来做到这一点。
我还为节点指定了不同的 id 名称,但根 Controller 无法识别这些 fxml 中的节点。
是否可以为不同的 fxml 共享相同的 Controller ?
提前致谢
最佳答案
背景
我不知道真的推荐共享 Controller 实例,至少我以前从未见过这样做过。
即使您将要加载的每个 fxml 中的 Controller 类设置为相同的值,它也不会共享相同的 Controller 实例,因为每次加载 Controller 时,它都会创建一个新的实例(对象) Controller 类(这似乎不是你想要的)。
潜在解决方案
我还没有尝试过这些解决方案中的任何一个,但相信它们会起作用。
每次加载新的 fxml 文件时,可能都会调用 initialize 方法。因此,您需要通过初始化 idempotent 在您的逻辑中考虑到这一点。 .
A. 手动设置 Controller 实例。
MyController controller = new MyController();
FXMLLoader loader = new FXMLLoader();
loader.setController(controller);
Panel panel = (Panel) loader.load("myfxml.fxml");
B. 使用 Controller 工厂。
您可以 set a controller factory在您的 fxml 加载器上并让 Controller 工厂始终返回相同的 Controller 实例。
关于JavaFX 多个 FXML 和 1 个共享 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17914254/