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



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

当加载fxml文件的场景,是我的程序加载控制器文件的副本只是为(和只使用)的fxml文件?

非常感谢你们对这个问题的回答。

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

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

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

同样,如果你加载不同的fxml文件,它们都由相同的控制器类支持——每次你加载fxml文件,你都会得到一个新的控制器实例。


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

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

传递参数JavaFX FXML

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

有一个很好的教程来处理多个fxml文件,你可能会觉得很有帮助:

  • 第一部分
  • 第二部分

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

Greg Brown在评论中指出:

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

我强烈不建议使用以下方法,这在

的相关回答中有进一步的解释:
  • JavaFX多个FXML和1个共享控制器

相关内容

最新更新