java - FXMLLoader 如何加载 FXML 的 Controller ?

标签 java javafx-2 javafx fxml javafx-8

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

假设 FXML Controller 扩展了一个具有构造函数的类。是否可以保证调用构造函数?如果没有,将如何创建对象的新实例?例如,在下面的代码中,是否会调用 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 在构建 Controller 时到底做了什么?”:

首先它会尝试获取一个 Controller 实例:

  • 如果 FXMLLoader 上已经设置了一个 Controller 实例,它将使用这个实例。
  • 如果 FXMLLoader 上没有设置 Controller 工厂,它会尝试在每次反射时调用该类的零参数构造函数。如果失败,则会抛出 InstantiationException。
  • 如果有 Controller 工厂集,它会调用这个工厂来创建一个新的 Controller 实例。

获取 Controller 实例后,它将对其执行以下操作:

  • 如果此类实现 Initializable,它会调用 public void initialize(URL url, ResourceBundle resourceBundle)。如果没有,它会查找是否有一个名为 initialize 的零参数方法,并通过反射调用它。如果不是,它什么也不做。

关于java - FXMLLoader 如何加载 FXML 的 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19265954/

相关文章:

java - 与其他 'server' 应用程序相比,servlet 的用途、重要性

java - 如何在另一个类中获取java类的值

java - JavaFX 中的按钮加速器

java - 如何在 Angela Caicedo 关于在 JavaFX 中管理多个屏幕的框架中的新 JavaFx 阶段打开新屏幕

可编辑单元格上的 JavaFX 工具提示

java - 为什么我没有收到 NullPointerException

java - IBM Domino 设计器

java - 文本对象拒绝改变颜色,尽管 CSS 指令这样做

java - CSS 仅应用于奇数行

java - 如何为 TableView 的一行着色?