我有在SceneBuilder和一个控制器文件中创建的多个FXML文件。当我在一个场景中编辑一个值(比如说一个整数值),然后切换场景时,该值在新场景中似乎没有改变。有多个FXML文件(在SceneBuilder中创建),但只有一个控制器。每个场景是否加载它自己的控制器副本?
当装载FXML文件的场面,是我的程序加载只是为了控制文件的副本(只有通过使用),其FXML文件?
非常感谢所有帮助你们能给回答这个问题。
我有在SceneBuilder和一个控制器文件中创建的多个FXML文件。当我在一个场景中编辑一个值(比如说一个整数值),然后切换场景时,该值在新场景中似乎没有改变。有多个FXML文件(在SceneBuilder中创建),但只有一个控制器。每个场景是否加载它自己的控制器副本?
当装载FXML文件的场面,是我的程序加载只是为了控制文件的副本(只有通过使用),其FXML文件?
非常感谢所有帮助你们能给回答这个问题。
你的控制器文件是被编译到从中可以创建许多Java对象实例一个Java类的Java源文件。
在运行时,默认的fxml加载器控制器工厂实现将在您每次调用fxml加载器的load method时创建一个新的控制器实例(即新对象)。
即使你一遍又一遍加载相同FXML文件,加载程序将创建一个新的控制器实例每次,每个都有它自己的内部状态,独立于所有其他人。
同样,如果您加载不同的文件FXML全部由相同的控制器类的支持 - 每次你任何FXML文件,你会得到一个新的控制器实例。
更新回答关于控制器数据的附加问题共享
要使用依赖注入或单独的初始化方法共享控制器之间的信息,请参见:
Passing Parameters JavaFX FXML
同样,使用static class members将允许您分享信息。只是不要使用静态结合@FXML
,as that won't work。
有一个很好的教程多FXML文件,你可能会发现有用的工作:
注:这是技术上是可行的分享在多个FXML文件的单个控制器
如由格雷格·布朗评论中指出:
有可能行使使用
FXMLLoader#setController()
和FXMLLoader#setControllerFactory()
控制器实例更大的控制权。
我强烈不推荐以下方法,这是进一步在相关答案解释:
谢谢,jewelsea!我认为可能是这样。由于每个加载的fxml文件都有一个新的控制器实例,有没有办法让这些实例共享信息?或者如果我要重写我的程序为每个fxml文件使用不同的控制器,您是否可以获得不同的控制器来共享信息? – Aaron 2013-04-23 15:01:49
解决方案已更新,解决其他问题。 – jewelsea 2013-04-23 16:06:50
你摇滚,jewelsea!我现在来看看那些。非常非常感谢你!! – Aaron 2013-04-23 17:57:02