Java FXMLLoader如何加载FXML';谁的控制器?
在JavaFX中调用FXMLLoader#load()时会发生什么 假设FXML控制器扩展了一个具有构造函数的类。能否保证调用构造函数?如果没有,将如何创建该对象的新实例?例如,在下面的代码中,会调用TextField()构造函数吗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
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的方法,该方法使用零参数并通过反射调用它。如果没有,它什么也做不了