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