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

时间:2013-04-23 00:10:53

标签: controller javafx fxml

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

当为场景加载fxml文件时,我的程序是否正在加载控制器文件的副本(仅用于该fxml文件)?

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

1 个答案:

答案 0 :(得分:15)

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

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

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

同样,如果加载所有由同一控制器类支持的不同fxml文件 - 每次有fxml文件时,都会得到一个新的控制器实例。


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

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

Passing Parameters JavaFX FXML

此外,使用static class members将允许您共享信息。只是不要将静态与@FXMLas that won't work结合使用。

有一个很好的教程可以使用多个fxml文件,您可能会觉得有用:


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

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

  

可以使用FXMLLoader#setController()FXMLLoader#setControllerFactory()对控制器实例化进行更好的控制。

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