controller - 有多个 FXML 文件(在 SceneBuilder 中创建),但只有一个 Controller 。每个场景是否加载它自己的 Controller 副本?

标签 controller javafx fxml

我在 SceneBuilder 中创建了多个 FXML 文件和一个 Controller 文件。当我在一个场景中编辑一个值(例如,一个整数值),然后切换场景时,该值在新场景中似乎没有改变。

为场景加载 fxml 文件时,我的程序是否仅为该 fxml 文件加载 Controller 文件的副本(并且仅由该 fxml 文件使用)?

非常感谢你们可以回答这个问题的任何帮助。

最佳答案

您的 Controller 文件是一个 Java 源文件,它被编译成一个 Java 类,可以从中创建许多 Java 对象实例。

在运行时,每次调用 fxml 加载器的 load method 时,默认的 fxml 加载器 Controller 工厂实现都会创建一个新的 Controller 实例(即新对象)。 .

即使你一遍又一遍地加载同一个 fxml 文件,加载器每次都会创建一个新的 Controller 实例,每个都有自己的内部状态,独立于所有其他的。

同样,如果您加载不同的 fxml 文件,它们都由同一个 Controller 类支持 - 每次您访问任何 fxml 文件时,您都会获得一个新的 Controller 实例。

更新以回答有关 Controller 数据共享的其他问题

要使用依赖注入(inject)或单独的初始化方法在 Controller 之间共享信息,请参阅:

Passing Parameters JavaFX FXML

此外,使用 static class members将允许您共享信息。只是不要将静态与 @FXML 结合使用, as that won't work .

有一个很好的教程来处理多个 fxml 文件,您可能会发现它很有帮助:

  • Part I
  • Part II


  • 注意:技术上可以在多个 FXML 文件之间共享一个 Controller

    正如格雷格布朗在评论中指出的那样:

    it is possible to exercise greater control over controller instantiation using FXMLLoader#setController() and FXMLLoader#setControllerFactory().



    我强烈不推荐以下方法,相关答案中对此进行了进一步解释:
  • JavaFX multiple FXML and 1 shared controller
  • 关于controller - 有多个 FXML 文件(在 SceneBuilder 中创建),但只有一个 Controller 。每个场景是否加载它自己的 Controller 副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16158815/

    相关文章:

    javascript - MVC 使用上下文在数据库中查找记录

    java - 更改客户端-服务器应用程序中圆圈的颜色

    asp.net - 获取 Controller 中隐藏字段的值 (ASP.NET MVC)

    Laravel,具有自定义策略方法的自定义 Controller 方法?

    java - 如何强制更新 JavaFX XYChart 的布局

    javafx 表单元格 onEditCommit 事件未触发?

    java - Netbeans 表示 observablearrayList 的 FXML 文件中不存在类,但它确实存在

    javafx - 如何使用FXML创建Integer微调器

    asp.net-mvc - 如何根据查询字符串值更改 ASP.Net MVC 5 中的主题?

    java - 在 Javafx 中为新的 ListView 条目设置动画