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

时间:2013-07-28 23:54:54

标签: javafx fxml

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

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

我也为节点提供了不同的id名称,但根控制器无法识别这些fxml中的节点。

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

提前致谢

1 个答案:

答案 0 :(得分:9)

<强>背景

我不知道真的建议共享控制器实例,至少我以前从未见过它。

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

潜在解决方案

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

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

甲。手动设置控制器实例。

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

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

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

  5. B中。使用控制器工厂。

    您可以在fxml加载器上set a controller factory并让控制器工厂始终返回相同的控制器实例。