有多个FXML文件(在SceneBuilder中创建),但只有一个控制器.每个场景是否加载了自己的控制器副本?

Aar*_*ron 5 controller javafx fxml

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

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

非常感谢你们能回答这个问题的任何帮助.

jew*_*sea 15

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

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

即使您反复加载相同的fxml文件,加载器也会每次创建一个新的控制器实例,每个实例都有自己的内部状态,独立于其他实例.

同样,如果您加载所有由同一控制器类支持的不同fxml文件 - 每次有任何fxml文件时,您将获得一个新的控制器实例.


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

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

传递参数JavaFX FXML

此外,使用静态类成员将允许您共享信息.只是不要结合使用静态@FXML,因为这不起作用.

有一个很好的教程可以使用多个fxml文件,您可能会发现这些文件很有帮助:


注意:从技术上讲,可以在多个FXML文件中共享一个控制器

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

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

我强烈建议不要采用以下方法,在相关答案中进一步说明:

  • 此外,您可以考虑使用pubB/sub API(如EventBus(http://eventbus.org/))进行控制器间通信.控制器可以订阅他们希望被通知的主题,并发布消息以供其他控制器响应. (2认同)