4

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

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

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

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

提前致谢

4

1 回答 1

9

背景

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

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

潜在的解决方案

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

每次加载新的 fxml 文件时,可能都会调用 initialize 方法。因此,您将希望通过使 initialize 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 加载器上设置控制器工厂,并让控制器工厂始终返回相同的控制器实例。

于 2013-07-29T01:32:24.793 回答