我已经为一个ScreenController类(一个由每个屏幕的单个控制器类扩展的类)创建了一个解决方案,它将处理我的应用程序中的基线屏幕层次结构。
在我的类中,我使用一个函数将另一个FXML文件的内容(加载)添加到当前控制器的当前主播上。
我的问题是:
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 <代码>不是框架,尽管它可以作为框架的基础。没有容器管理控制器类的实例或加载的根。由fxmloader
创建的对象会发生什么情况由应用程序代码决定。
FXML文件只是一个描述对象图的XML格式的文本文件。fxmloader
只是解释该文件并创建所述对象图1。当然,FXML格式有一些特别添加的语法来处理JavaFX特定的特性(例如添加事件处理程序、绑定等)。
1) 加载新的FXML时,FXML使用的类(或者更确切地说,特定的控制器)是否也被实例化/加载?
如果您在FXML文件的根元素中有一个fx:控制器
属性,那么是的,将创建指定控制器类的新实例(默认情况下)。FXML文件描述的所有对象也是如此。换句话说,每次加载FXML文件时,FXMLLoader
都会返回根和控制器的新实例。控制器实例的创建方式可以通过在FXMLLoader
上设置自定义的控制器工厂
来定制。
如果您没有fx:控制器
属性,那么要么没有控制器实例,要么您需要以编程方式指定一个。在这种情况下,您可以手动提供控制器实例。
注意:不要在不同的FXML文件之间共享控制器类,也不要在不同的加载之间共享控制器实例。这样做会造成各种混乱,而且不必要地复杂。也就是说,拥有一个通用的抽象类可能是合适的,只要它只有每个子类所共有的状态和行为。
2) 执行此操作时,如果新FXMl的类被实例化/加载,则前一个FXMl的类是否从内存中释放?还是仍在使用内存。
如本答案开头所述,FXMLLoader
只需解释FXML文件并创建相应的对象图1。一旦它这样做了,创建的对象会发生什么就取决于你了。只要对象可以被任何线程强访问,它们就不会被垃圾收集。
如果您问如果重用FXMLLoader
实例会发生什么,我不完全确定,因为我从未尝试过。简单地说,我建议每次要加载FXML文件(或使用静态load(URL)
方法)时创建一个新的FXMLLoader
实例。
1。创建对象图后,如果存在控制器,FXMLLoader
还将注入任何适当的字段并“链接”所有适当的方法
问题内容: 因此,我正在为学校项目编码此聊天客户端,现在我需要使用JavaFX实现GUI。我已经在Scene Builder中构建了外观简洁的GUI。现在,无论何时客户端收到一条消息,它都应该在控制器中调用一个方法,以将接收到的字符串附加到TextField上。 但是,当我尝试从FXML文件加载控制器时,出现此错误: 这是获取控制器并在其中调用方法的代码: 最后,我的FXML文件: 加载徽标图像时
问题内容: 当我在JavaFX中调用FXMLLoader#load()时会发生什么? 假设FXML控制器扩展了具有构造函数的类。是否可以保证构造函数将被调用?如果没有,将如何创建该对象的新实例?例如,在下面的代码中,是否将调用TextField()构造函数? 我已经尝试过搜索这个,但是除了“从FXML文档中加载对象层次结构”之外,似乎没有关于它的文档。来自http://docs.oracle.co
我已经试着搜索了这篇文章,但是除了“从FXML文档加载对象层次结构”之外,似乎没有关于它的文档。摘自http://docs.oracle.com/javafx/2/api/javafx/fxml/fxmlloader.html 你的回答将不胜感激。多谢!
我一直在做一个桌面应用程序,在那里我需要使用JavaFX。我在使用Scene Builder构建的eclipse上的JavaFX项目中创建了各种FXML文件。除了这个讨厌的文件(fxmlimglist.FXML)外,我加载任何FXML文件都没有问题。 其主要思想是,当按下一个按钮时,会出现一个新窗口。下面是该按钮的事件处理程序的代码: package explorer中的项目如下所示: https
问题内容: 我有一个登录屏幕,我想将登录ID从LoginController传递到MainController,因此我可以访问一些功能来更改密码和其他功能。 我这样加载控制器: Main.fxml绑定到MainController.java。有没有一种方法可以传递所需的用户ID,并在控制器的initialize()方法上对其进行访问? 问题答案: 用FXMLLoader加载控制器后,可以在调用sh
我这样加载控制器: fxml绑定到MainController.java。有没有一种方法可以传递我需要的用户ID,并在控制器的initialize()方法上访问它?