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