加载FXML文件时,它的关联控制器也已加载

时间:2019-08-15 12:00:04

标签: java intellij-idea javafx fxml

我为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);
}

2 个答案:

答案 0 :(得分:1)

了解FXMLLoader不是框架,尽管它可以用作框架的基础。没有容器可以管理控制器类或加载的根的实例。由FXMLLoader创建的对象会发生什么由应用程序代码决定。

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


  

1)加载新的FXML时,是否也实例化/加载了FXML使用的类(或特定的控制器)?

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

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

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


  

2)这样做时,如果实例化/加载了新的FXMl的类,是否从内存中释放了以前的FXML的类?还是仍在使用内存。

如该答案开头所述,FXMLLoader只是解释FXML文件并创建适当的对象图 1 。完成此操作后,由您决定如何创建对象。只要任何线程都可以强烈访问对象,就不会对其进行垃圾回收。

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


1。创建对象图之后,如果存在控制器,则FXMLLoader还将注入任何适当的字段并“链接”所有适当的方法。

答案 1 :(得分:-1)

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