加载 FXML 文件时,是否也加载了关联的控制器
When an FXML file is loaded is it's associated controller also loaded
我已经为 ScreenController class(一个 class 由每个屏幕的单独控制器 class 扩展)创建了一个解决方案,它将处理基线屏幕层次结构在我的应用程序中。
在我的 class 中,我使用一个函数将另一个 FXML 文件的内容添加(加载)到当前控制器的当前 AnchorPane 中。
我的问题是:
1) 加载新的 FXML 时,FXML 使用的 class(或者更确切地说,特定控制器)是否也 instantiated/loaded?
2) 这样做的时候,如果新的FXML的class是instantiated/loaded,那么之前的FXML的class是不是从内存中释放了?还是还在占用内存。
屏幕转换代码:
public void setScreen(String screen) throws Exception
{
Parent root = FXMLLoader.load(getClass().getResource(screen));
window.getChildren().setAll(root);
}
这取决于您如何使用 FXMLLoader。有静态和非静态加载方法,还有可以提供控制器实例的方法。最好看看 FXMLLoader class 文档中的各种加载方法。
了解 FXMLLoader
不是框架,尽管它可以用作框架的基础。没有管理控制器实例 classes 或加载的根的容器。 FXMLLoader
创建的对象会发生什么由应用程序代码决定。
FXML 文件只是描述对象图的 XML 格式的文本文件。 FXMLLoader
简单地解释该文件并创建所述对象图 1。当然,FXML 格式有一些特殊添加的语法来处理 JavaFX 特定功能(例如添加事件处理程序、绑定等)。
1) When the new FXML is loaded, is the class (or rather, the specific controller) the FXML uses also instantiated/loaded?
如果您在 FXML 文件的根元素中有一个 fx:controller
属性,那么是的,将创建指定控制器 class 的新实例(默认情况下)。 FXML 文件描述的所有对象也是如此。换句话说,每次加载 FXML 文件时,FXMLLoader
都会 return 根和控制器的新实例 。可以通过在 FXMLLoader
.
上设置自定义 controllerFactory
来自定义创建控制器实例的方式
如果您没有 fx:controller
属性,那么要么没有控制器实例,要么您需要以编程方式指定一个。在这种情况下,您手动提供控制器实例。
注意:切勿在不同 FXML 文件之间共享控制器 class,并且切勿在不同负载之间共享控制器实例。这样做会引起各种混乱,并且不必要地复杂。也就是说,拥有一个共同的抽象 class 可能是合适的,只要它只有每个子 class.
共有的状态和行为
2) When doing this, if the new FXMl's class is instantiated/loaded, is the previous FXML's class released from memory? or is it still using memory.
如本答案开头所述,FXMLLoader
仅解释 FXML 文件并创建适当的对象图 1。一旦它这样做了,创建的对象会发生什么就取决于你了。只要对象可以被任何线程强访问,它们就不会被垃圾回收。
如果你问如果你重用一个 FXMLLoader
实例会发生什么,我不完全确定,因为我从未尝试过。可以这么说,我建议每次要加载 FXML 文件时创建一个新的 FXMLLoader
实例(或使用静态 load(URL)
方法)。
1.创建对象图后,如果存在控制器,则 FXMLLoader
还将注入任何适当的字段和 "link" 所有适当的方法。
我已经为 ScreenController class(一个 class 由每个屏幕的单独控制器 class 扩展)创建了一个解决方案,它将处理基线屏幕层次结构在我的应用程序中。
在我的 class 中,我使用一个函数将另一个 FXML 文件的内容添加(加载)到当前控制器的当前 AnchorPane 中。
我的问题是:
1) 加载新的 FXML 时,FXML 使用的 class(或者更确切地说,特定控制器)是否也 instantiated/loaded?
2) 这样做的时候,如果新的FXML的class是instantiated/loaded,那么之前的FXML的class是不是从内存中释放了?还是还在占用内存。
屏幕转换代码:
public void setScreen(String screen) throws Exception
{
Parent root = FXMLLoader.load(getClass().getResource(screen));
window.getChildren().setAll(root);
}
这取决于您如何使用 FXMLLoader。有静态和非静态加载方法,还有可以提供控制器实例的方法。最好看看 FXMLLoader class 文档中的各种加载方法。
了解 FXMLLoader
不是框架,尽管它可以用作框架的基础。没有管理控制器实例 classes 或加载的根的容器。 FXMLLoader
创建的对象会发生什么由应用程序代码决定。
FXML 文件只是描述对象图的 XML 格式的文本文件。 FXMLLoader
简单地解释该文件并创建所述对象图 1。当然,FXML 格式有一些特殊添加的语法来处理 JavaFX 特定功能(例如添加事件处理程序、绑定等)。
1) When the new FXML is loaded, is the class (or rather, the specific controller) the FXML uses also instantiated/loaded?
如果您在 FXML 文件的根元素中有一个 fx:controller
属性,那么是的,将创建指定控制器 class 的新实例(默认情况下)。 FXML 文件描述的所有对象也是如此。换句话说,每次加载 FXML 文件时,FXMLLoader
都会 return 根和控制器的新实例 。可以通过在 FXMLLoader
.
controllerFactory
来自定义创建控制器实例的方式
如果您没有 fx:controller
属性,那么要么没有控制器实例,要么您需要以编程方式指定一个。在这种情况下,您手动提供控制器实例。
注意:切勿在不同 FXML 文件之间共享控制器 class,并且切勿在不同负载之间共享控制器实例。这样做会引起各种混乱,并且不必要地复杂。也就是说,拥有一个共同的抽象 class 可能是合适的,只要它只有每个子 class.
共有的状态和行为2) When doing this, if the new FXMl's class is instantiated/loaded, is the previous FXML's class released from memory? or is it still using memory.
如本答案开头所述,FXMLLoader
仅解释 FXML 文件并创建适当的对象图 1。一旦它这样做了,创建的对象会发生什么就取决于你了。只要对象可以被任何线程强访问,它们就不会被垃圾回收。
如果你问如果你重用一个 FXMLLoader
实例会发生什么,我不完全确定,因为我从未尝试过。可以这么说,我建议每次要加载 FXML 文件时创建一个新的 FXMLLoader
实例(或使用静态 load(URL)
方法)。
1.创建对象图后,如果存在控制器,则 FXMLLoader
还将注入任何适当的字段和 "link" 所有适当的方法。