7

当我在 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

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

4

2 回答 2

14

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

首先它会尝试获取一个控制器实例:

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

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

  • 如果这个类实现了Initializable,它会调用public void initialize(URL url, ResourceBundle resourceBundle)。如果没有,它会查看是否有一个名为 initialize 且参数为零的方法,并通过反射调用它。如果没有,它什么也不做。
于 2013-10-09T07:50:38.290 回答
1

我不完全确定您要做什么,但通常控制器不应扩展文本字段。

除此之外,这是基本的 java 东西:textfield 有一个空的构造函数,你的控制器没有,所以 java 将(默认情况下)调用 TextField 中可用的空构造函数。默认情况下,TextField 构造函数(即使它不在代码中)调用它扩展的类的构造函数,依此类推。如果不调用构造函数,就无法在 java 中构造对象。

于 2013-10-09T07:49:27.010 回答