我在 SceneBuilder 中创建了多个 FXML 文件和一个控制器文件。当我在一个场景中编辑一个值(例如,一个整数值),然后切换场景时,该值在新场景中似乎没有改变。
为场景加载 fxml 文件时,我的程序是否仅为该 fxml 文件加载控制器文件的副本(并且仅由该 fxml 文件使用)?
非常感谢你们可以回答这个问题的任何帮助。
我在 SceneBuilder 中创建了多个 FXML 文件和一个控制器文件。当我在一个场景中编辑一个值(例如,一个整数值),然后切换场景时,该值在新场景中似乎没有改变。
为场景加载 fxml 文件时,我的程序是否仅为该 fxml 文件加载控制器文件的副本(并且仅由该 fxml 文件使用)?
非常感谢你们可以回答这个问题的任何帮助。
您的控制器文件是一个 Java 源文件,它被编译成一个 Java 类,可以从中创建许多 Java 对象实例。
在运行时,每次调用 fxml 加载器的load 方法时,默认的 fxml 加载器控制器工厂实现都会创建一个新的控制器实例(即新对象) 。
即使你一遍又一遍地加载同一个 fxml 文件,加载器每次都会创建一个新的控制器实例,每个都有自己的内部状态,独立于所有其他的。
同样,如果您加载不同的 fxml 文件,它们都由同一个控制器类支持 - 每次您访问任何 fxml 文件时,您都会获得一个新的控制器实例。
更新以回答有关控制器数据共享的其他问题
要使用依赖注入或单独的初始化方法在控制器之间共享信息,请参阅:
此外,使用静态类成员将允许您共享信息。只是不要将 static 与 结合使用@FXML
,因为那是行不通的。
有一个很好的教程来处理多个 fxml 文件,您可能会发现它很有帮助:
注意:技术上可以在多个 FXML 文件之间共享一个控制器
正如格雷格布朗在评论中指出的那样:
FXMLLoader#setController()
使用和可以更好地控制控制器实例化FXMLLoader#setControllerFactory()
。
我强烈不推荐以下方法,相关答案中对此进行了进一步解释: