Java 加载FXML文件时,它是否为';s关联的控制器也已加载

Java 加载FXML文件时,它是否为';s关联的控制器也已加载,java,intellij-idea,javafx,fxml,Java,Intellij Idea,Javafx,Fxml,我已经为ScreenController类创建了一个解决方案(该类由每个屏幕的各个控制器类扩展),它将处理我的应用程序中的基线屏幕层次结构 在我的类中,我使用一个函数将另一个FXML文件的内容(加载)添加到当前控制器的当前AnchorPane上 我的问题是: 1) 加载新的FXML时,FXML使用的类(或者更确切地说,是特定的控制器)是否也被实例化/加载 2) 执行此操作时,如果实例化/加载了新的FXMl类,是否从内存中释放了以前的FXMl类?或者它仍然在使用内存 屏幕转换代码: public

我已经为ScreenController类创建了一个解决方案(该类由每个屏幕的各个控制器类扩展),它将处理我的应用程序中的基线屏幕层次结构

在我的类中,我使用一个函数将另一个FXML文件的内容(加载)添加到当前控制器的当前AnchorPane上

我的问题是:

1) 加载新的FXML时,FXML使用的类(或者更确切地说,是特定的控制器)是否也被实例化/加载

2) 执行此操作时,如果实例化/加载了新的FXMl类,是否从内存中释放了以前的FXMl类?或者它仍然在使用内存

屏幕转换代码:

public void setScreen(String screen) throws Exception
{
    Parent root = FXMLLoader.load(getClass().getResource(screen));
    window.getChildren().setAll(root);
}

这取决于您如何使用FXMLLoader。有静态和非静态加载方法,也有可以提供控制器实例的方法。最好查看FXMLLoader类文档中的各种加载方法。

这取决于您如何使用FXMLLoader。有静态和非静态加载方法,也有可以提供控制器实例的方法。最好查看FXMLoLoad类文档中的各种加载方法。

理解<代码> FXMLLoader <代码>不是框架,尽管它可以作为框架的基础。没有容器管理控制器类的实例或加载的根。由

fxmloader
创建的对象发生的情况由应用程序代码决定

FXML文件只是一个描述对象图的XML格式的文本文件。
fxmloader
仅解释该文件并创建所述对象图1。当然,FXML格式有一些特别添加的语法来处理JavaFX特定的特性(例如添加事件处理程序、绑定等)


1) 加载新的FXML时,FXML使用的类(或者更确切地说,是特定的控制器)是否也被实例化/加载

如果在FXML文件的根元素中有
fx:controller
属性,则是,将创建指定控制器类的新实例(默认情况下)。FXML文件描述的所有对象也是如此。换句话说,每次加载FXML文件时,
FXMLLoader
将返回根和控制器的新实例。通过在
FXMLLoader
上设置自定义
controllerFactory
,可以自定义控制器实例的创建方式

如果没有
fx:controller
属性,则不会有控制器实例,或者需要以编程方式指定一个。在这种情况下,您可以手动提供控制器实例

注意:不要在不同的FXML文件之间共享控制器类,也不要在不同的加载之间共享控制器实例。这样做会引起各种混乱,而且不必要地复杂。也就是说,拥有一个通用的抽象类可能是合适的,只要它只有每个子类通用的状态和行为


2) 执行此操作时,如果实例化/加载了新的FXMl类,是否从内存中释放了以前的FXMl类?或者它仍然在使用内存

如本答案开头所述,
fxmloader
仅解释一个FXML文件并创建相应的对象图1。一旦它这样做了,对所创建对象的影响将取决于您。只要对象可以被任何线程强访问,它们就不会被垃圾收集

如果您问如果重用
fxmloader
实例会发生什么,我不完全确定,因为我从未尝试过。我建议您在每次加载FXML文件时创建一个新的
FXMLLoader
实例(或者使用静态
load(URL)
方法)



一,。在创建对象图之后,如果存在一个控制器,则<代码> FXMLLoader < /代码>也会注入任何适当的字段和“链接”所有适当的方法。

理解<代码> FXMLLoader <代码>不是框架,尽管它可以作为框架的基础。没有容器管理控制器类的实例或加载的根。由

fxmloader
创建的对象发生的情况由应用程序代码决定

FXML文件只是一个描述对象图的XML格式的文本文件。
fxmloader
仅解释该文件并创建所述对象图1。当然,FXML格式有一些特别添加的语法来处理JavaFX特定的特性(例如添加事件处理程序、绑定等)


1) 加载新的FXML时,FXML使用的类(或者更确切地说,是特定的控制器)是否也被实例化/加载

如果在FXML文件的根元素中有
fx:controller
属性,则是,将创建指定控制器类的新实例(默认情况下)。FXML文件描述的所有对象也是如此。换句话说,每次加载FXML文件时,
FXMLLoader
将返回根和控制器的新实例。通过在
FXMLLoader
上设置自定义
controllerFactory
,可以自定义控制器实例的创建方式

如果没有
fx:controller
属性,则不会有控制器实例,或者需要以编程方式指定一个。在这种情况下,您可以手动提供控制器实例

注意:不要在不同的FXML文件之间共享控制器类,也不要在不同的加载之间共享控制器实例。这样做会引起各种混乱,而且不必要地复杂。也就是说,拥有一个通用的抽象类可能是合适的,只要它只有每个子类通用的状态和行为


2) 什么时候