【问题标题】:JavaFX multiple FXML and 1 shared controllerJavaFX 多个 FXML 和 1 个共享控制器
【发布时间】:2013-07-28 23:54:54
【问题描述】:

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

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

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

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

提前致谢

【问题讨论】:

    标签: javafx fxml


    【解决方案1】:

    背景

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

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

    可能的解决方案

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

    initialize 方法可能会在您每次加载新的 fxml 文件时被调用。因此,您需要通过初始化 idempotent 在您的逻辑中考虑这一点。

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

    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 步,每次使用相同的控制器引用。

    B.使用控制器工厂。

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

    【讨论】:

    • 为什么要删除所有对控制器类的引用?
    • 因为,如果你要在代码中设置控制器类,你不需要在 fxml 中引用它。如果您不从 fxml 中删除控制器引用,则可能会造成混淆。例如,fxml 加载器实现可能会看到您在 fxml 中引用的控制器类并实例化所引用控制器类的新实例,而不是使用您在代码中设置的实例。对于 fxml 中的控制器引用,它可能会像您期望的那样工作,也可能不会。
    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多