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