6

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

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

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

4

1 回答 1

16

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

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

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

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


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

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

传递参数 JavaFX FXML

此外,使用静态类成员将允许您共享信息。只是不要将 static 与 结合使用@FXML因为那是行不通的

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


注意:技术上可以在多个 FXML 文件之间共享一个控制器

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

FXMLLoader#setController()使用和可以更好地控制控制器实例化FXMLLoader#setControllerFactory()

我强烈不推荐以下方法,相关答案中对此进行了进一步解释:

于 2013-04-23T00:34:49.860 回答