我为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);
}
答案 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类文档中的各种加载方法。