gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:06:38 31 4
gpt4 key购买 nike

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

为场景加载 fxml 文件时,我的程序是否仅为该 fxml 文件加载 Controller 文件的副本(并且仅由该 fxml 文件使用)?

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

最佳答案

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

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

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

同样,如果您加载不同的 fxml 文件,它们都由同一个 Controller 类支持 - 每次您访问任何 fxml 文件时,您都会获得一个新的 Controller 实例。

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

要使用依赖注入(inject)或单独的初始化方法在 Controller 之间共享信息,请参阅:

Passing Parameters JavaFX FXML

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

有一个很好的教程来处理多个 fxml 文件,您可能会发现它很有帮助:

  • Part I
  • Part II


  • 注意:技术上可以在多个 FXML 文件之间共享一个 Controller

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

    it is possible to exercise greater control over controller instantiation using FXMLLoader#setController() and FXMLLoader#setControllerFactory().



    我强烈不推荐以下方法,相关答案中对此进行了进一步解释:
  • JavaFX multiple FXML and 1 shared controller
  • 关于controller - 有多个 FXML 文件(在 SceneBuilder 中创建),但只有一个 Controller 。每个场景是否加载它自己的 Controller 副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16158815/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com