繁体   English   中英

FXMLLoader如何加载FXML的控制器?

[英]How does FXMLLoader load the FXML's controller?

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

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

回答你的问题“FXMLLoader在构建控制器时的作用是什么?”:

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

  • 如果FXMLLoader上已经设置了控制器实例,它将使用此实例。
  • 如果FXMLLoader上没有设置控制器工厂,它会尝试按反射调用类的零参数构造函数。 如果失败,则抛出InstantiationException。
  • 如果有一个控制器工厂设置,它将调用此工厂来创建一个新的控制器实例。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM