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

use*_*646 4 javafx fxml

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

这些fxml中的每一个共享相同的控制器,根控制器.我在netbeans中通过在创建空FXML文件时选择一个现有控制器来完成此操作.

我也给了节点不同的id名称,但根控制器不识别这些fxml中的节点.

是否有可能为不同的fxml共享相同的控制器?

提前致谢

jew*_*sea 9

背景

我不知道真的推荐共享控制器实例,至少我以前从未见过它.

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

潜在解决方案

我没有尝试过这些解决方案,但相信它们会起作用.

每次加载新的fxml文件时,都可能会调用initialize方法.因此,您需要通过初始化幂等来解释逻辑中的问题.

A.手动设置控制器实例.

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

    MyController controller = new MyController(); 
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在加载每个fxml之前,将控制器设置为控制器实例.

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

B.使用控制器工厂.

您可以在fxml加载设置控制器工厂,并让控制器工厂始终返回相同的控制器实例.