2013-04-23 58 views
5

我有在SceneBuilder和一个控制器文件中创建的多个FXML文件。当我在一个场景中编辑一个值(比如说一个整数值),然后切换场景时,该值在新场景中似乎没有改变。有多个FXML文件(在SceneBuilder中创建),但只有一个控制器。每个场景是否加载它自己的控制器副本?

当装载FXML文件的场面,是我的程序加载只是为了控制文件的副本(只有通过使用),其FXML文件?

非常感谢所有帮助你们能给回答这个问题。

回答

15

你的控制器文件是被编译到从中可以创建许多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()控制器实例更大的控制权。

我强烈不推荐以下方法,这是进一步在相关答案解释:

+0

谢谢,jewelsea!我认为可能是这样。由于每个加载的fxml文件都有一个新的控制器实例,有没有办法让这些实例共享信息?或者如果我要重写我的程序为每个fxml文件使用不同的控制器,您是否可以获得不同的控制器来共享信息? – Aaron 2013-04-23 15:01:49

+0

解决方案已更新,解决其他问题。 – jewelsea 2013-04-23 16:06:50

+1

你摇滚,jewelsea!我现在来看看那些。非常非常感谢你!! – Aaron 2013-04-23 17:57:02

相关问题