2013-10-09 85 views
6

当我在JavaFX中调用FXMLLoader#load()时会发生什么?FXMLLoader如何加载FXML的控制器?

假设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

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

回答

13

要回答你的问题“建设控制器时,什么对FXMLLoader做什么呢?”:

首先它会尝试得到一个控制器实例:

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

越来越控制器实例后,它会用它做如下:

  • 如果这个类实现Initializable,它调用公共无效的initialize(URL网址,资源包资源包)。如果没有,它看起来是否有一个方法称为零初始化并通过反射调用它。如果没有,它什么都不做。
+0

哇。感谢您的及时回复。该过程听起来很有趣。你想让我知道你的来源吗? –

+0

你可以很容易地测试这个行为,你也可以在openjdk的源代码中看到它 – Sebastian

+0

谢谢。我可能会检查openjdk。 –

1

我不完全确定你要做什么,但通常控制器不应该扩展文本字段。除此之外,这是基本的java东西:textfield有一个空的构造函数,你的控制器没有,所以java将(默认情况下)调用TextField中可用的空构造函数。 TextField的构造函数将默认(即使它不在代码中)调用它所继承的类的构造函数等等。如果没有调用构造函数,没有办法在java中构造一个对象。

+0

非常感谢您的及时回复。我在想可能会有像控制控件的文本字段。 –