Java FXMLLoader如何加载FXML';谁的控制器?

Java FXMLLoader如何加载FXML';谁的控制器?,java,javafx-2,javafx,fxml,javafx-8,Java,Javafx 2,Javafx,Fxml,Javafx 8,在JavaFX中调用FXMLLoader#load()时会发生什么 假设FXML控制器扩展了一个具有构造函数的类。能否保证调用构造函数?如果没有,将如何创建该对象的新实例?例如,在下面的代码中,会调用TextField()构造函数吗 import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.Initializable; import javafx.scene.control.TextField; public

在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文档加载对象层次结构”之外,似乎没有关于它的文档


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

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

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

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

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

  • 如果FXMLLoader上已经设置了控制器实例,它将使用此实例
  • 如果FXMLLoader上没有设置控制器工厂,它会尝试调用类的每个反射的零参数构造函数。如果失败,将抛出实例化异常
  • 如果存在控制器工厂集,它将调用此工厂以创建新的控制器实例
获取控制器实例后,它将对其执行以下操作:

  • 如果该类实现了Initializable,它将调用public void initialize(URL URL、ResourceBundle和ResourceBundle)。如果没有,它将查看是否有一个名为initialize的方法,该方法使用零参数并通过反射调用它。如果没有,它什么也做不了

哇。谢谢你的及时回复。这个过程听起来很有趣。你想让我知道你的源代码吗?你可以很容易地测试这个行为,你也可以在openjdkThanks上的源代码中看到它。我可能会查看openjdk。您还可以显式设置控制器(不仅仅是工厂)。谢谢Puce。当控制器已经设置好时,FXMLLoader会调用控制器的初始化方法吗?太好了,谢谢你的及时回复。我想可能有一个文本字段可以控制控件。