当前位置: 首页 > 面试题库 >

FXMLLoader如何加载FXML的控制器?

惠诚
2023-03-14
问题内容

当我在JavaFX中调用FXMLLoader#load()时会发生什么?

假设FXML控制器扩展了具有构造函数的类。是否可以保证构造函数将被调用?如果没有,将如何创建该对象的新实例?例如,在下面的代码中,是否将调用TextField()构造函数?

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
public class FXMLController extends TextField implements Initializable {
    @Override
    public void initialize(URL url, ResourceBundle rb) {

    }    
}

我已经尝试过搜索这个,但是除了“从FXML文档中加载对象层次结构”之外,似乎没有关于它的文档。来自http://docs.oracle.com/javafx/2/api/javafx/fxml/FXMLLoader.html

您的回答将不胜感激。非常感谢!


问题答案:

要回答您的问题“在构建控制器时FXMLLoader到底能做什么?”:

首先,它将尝试获取控制器实例:

  • 如果FXMLLoader上已经设置了控制器实例,它将使用该实例。
  • 如果在FXMLLoader上未设置控制器工厂,它将尝试为每个反射调用类的零参数构造函数。如果失败,则抛出InstantiationException。
  • 如果设置了控制器工厂,它将调用该工厂来创建一个新的控制器实例。

获取控制器实例后,它将执行以下操作:

  • 如果此类实现了Initializable,则它将调用public void initialize(URL url,ResourceBundle resourceBundle)。如果没有,它将检查是否存在一种方法,该方法使用零参数进行初始化,并通过反射进行调用。如果没有,它什么也不做。


 类似资料:
  • 我已经试着搜索了这篇文章,但是除了“从FXML文档加载对象层次结构”之外,似乎没有关于它的文档。摘自http://docs.oracle.com/javafx/2/api/javafx/fxml/fxmlloader.html 你的回答将不胜感激。多谢!

  • 我试图在JavaFX中从一个控制器调用另一个控制器。我在我的代码的另一部分中以几乎完全相同的方式完成了这项工作,并且它起了作用,但出于某种原因,它在这里不起作用。 我正在获取FXML资源并加载它,但是当我调用能力信息ontroller.set能力名称文本(能力名称);它给我以下错误说能力信息控制器是NULL:

  • 我第一次尝试使用JavaFx与Maven。通过这个主题:链接IntelliJ不能识别JavaFX 11与OpenJDK 11,我配置的项目。但是无论我做什么,我都不能加载fxml文件,因为"getClass(). getResources(path)"返回null。 我更改了路径,以“/”开头,没有,更改了包,创建了包,删除了包,更改了模块信息中的引用,但这不起作用。 结构:https://ibb

  • 我正在尝试实现下面所示的基本JavaFX示例:http://docs.oracle.com/JavaFX/2/get_started/fxml_tutorial.htm。我能够让基本的东西工作(以编程方式创建gui)和使用css,但我遇到了FXMLLoader的问题。 java版本是这样的: 我不是Java专家,但我不认为FXMLLoader对象是实例化的IE。没有语句。那么是从哪里来的呢? nu

  • 问题内容: 因此,我正在为学校项目编码此聊天客户端,现在我需要使用JavaFX实现GUI。我已经在Scene Builder中构建了外观简洁的GUI。现在,无论何时客户端收到一条消息,它都应该在控制器中调用一个方法,以将接收到的字符串附加到TextField上。 但是,当我尝试从FXML文件加载控制器时,出现此错误: 这是获取控制器并在其中调用方法的代码: 最后,我的FXML文件: 加载徽标图像时

  • 更新 我试过很多解决办法,但都没有达到我的目标。应用程序加载UsersMainPageController,它只包含一个AnchorPane(类似于父控件),因此这是相关代码: [UsersMainPageController]