JavaFX 多个 FXML 和 1 个共享 Controller

标签 javafx fxml

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

这些 fxml 中的每一个都共享相同的 Controller ,即根 Controller 。我在 netbeans 中通过在创建空的 FXML 文件时选择一个现有的 Controller 来做到这一点。

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

是否可以为不同的 fxml 共享相同的 Controller ?

提前致谢

最佳答案

背景

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

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

潜在解决方案

我还没有尝试过这些解决方案中的任何一个,但相信它们会起作用。

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

A. 手动设置 Controller 实例。

  • 从 fxml 文件中删除对 Controller 类的所有引用。
  • 手动创建 Controller 类的实例。
    MyController controller = new MyController(); 
    
  • 在加载每个 fxml 之前,将 Controller 设置为您的 Controller 实例。
    FXMLLoader loader = new FXMLLoader();
    loader.setController(controller);
    Panel panel = (Panel) loader.load("myfxml.fxml");
    
  • 对每个 fxml 文件重复步骤 3,每次使用相同的 Controller 引用。

  • B. 使用 Controller 工厂。

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

    关于JavaFX 多个 FXML 和 1 个共享 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17914254/

    相关文章:

    java - 如何将数据从 Java 传递到 FXML?

    css - 如何动态更改 UI 中的字体大小以在 JavaFX 中始终保持相同的宽度?

    java - 在 JRE 8 中使用 JavaFX, “Access restriction” 错误

    java - 用于读取 JPEG 图像并将其写入数据库的示例 JavaFX 应用程序

    java - 如何将多个 fxml 与 javaFX 一起使用?

    java - 将 GridPane 扩展到最大宽度和高度

    java - 如何在 JavaFX 8 中创建自定义组件?

    JavaFX - 访问动态创建的选项卡 Controller

    java - fxml - 从属性读取值

    java - 无法使用 webstart 加载 FXML