JavaFX多个FXML和1个共享控制器

JavaFX多个FXML和1个共享控制器,javafx,fxml,Javafx,Fxml,我创建了一个根FXML,它是一个BorderPane,它有自己的根控制器。 我想动态地将FXML添加到此边框窗格的中心 每个fxml共享同一个控制器,根控制器。在netbeans中,我在创建空FXML文件时选择了一个现有的控制器 我还为节点指定了不同的id名称,但根控制器无法识别这些fxml中的节点 是否可以为不同的fxml共享同一控制器 提前感谢背景 我不知道是否真的建议共享控制器实例,至少我以前从未见过这样做 即使将要加载的每个fxml中的控制器类设置为相同的值,它也不会共享相同的控制器实例

我创建了一个根FXML,它是一个BorderPane,它有自己的根控制器。 我想动态地将FXML添加到此边框窗格的中心

每个fxml共享同一个控制器,根控制器。在netbeans中,我在创建空FXML文件时选择了一个现有的控制器

我还为节点指定了不同的id名称,但根控制器无法识别这些fxml中的节点

是否可以为不同的fxml共享同一控制器


提前感谢背景

我不知道是否真的建议共享控制器实例,至少我以前从未见过这样做

即使将要加载的每个fxml中的控制器类设置为相同的值,它也不会共享相同的控制器实例,因为每次加载控制器时,它都会创建控制器类的新实例(对象)(这似乎不是您想要的)

潜在解决方案

我没有尝试过这两种解决方案,但我相信它们会奏效

每次加载新的fxml文件时,都可能会调用initialize方法。因此,您需要在逻辑中通过使initialize来说明这一点

A.手动设置控制器实例

  • 从fxml文件中删除对控制器类的所有引用
  • 手动创建控制器类的实例

    MyController controller = new MyController(); 
    
  • 在加载每个fxml之前,将控制器设置为控制器实例

    FXMLLoader loader = new FXMLLoader();
    loader.setController(controller);
    Panel panel = (Panel) loader.load("myfxml.fxml");
    
  • 对每个fxml文件重复步骤3,每次使用相同的控制器引用

  • B.在工厂使用控制器


    您可以在fxml加载程序上,让控制器工厂始终返回相同的控制器实例。

    为什么要删除对控制器类的所有引用?因为,如果要在代码中设置控制器类,您不需要在fxml中引用它。如果不从fxml中删除控制器引用,则可能会造成混淆。例如,fxml加载器实现可能会看到您在fxml中引用的控制器类,并实例化所引用控制器类的新实例,而不是使用您在代码中设置的实例。对于fxml中的控制器引用,它可能会像您期望的那样工作,也可能不会。