超级初始化后,JavaFx调用super方法

时间:2016-12-02 02:36:13

标签: java javafx initialization fxml super

我有一个实现Initializable的类。

public abstract class ExampleClass implements Initializable {

    public void ExampleClass() {
        // Load FXML
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // Initialize stuff
    }

    public void afterInitialize() {
        // Do things that are reliant upon the FXML being loaded
    }
}

然后我扩展这个抽象类:

public class ExampleSubclass extends ExampleClass {

    public ExampleSubclass() {
        super(/* real code has params */);
        this.afterInitialize(); // Problem here
    }
}

然而,当我调用afterInitialize()时,它的行为就像抽象类中的FXML尚未加载一样。这让我感到困惑,因为我先调用了super()构造函数,所以我相信FXML应该已经加载了。

我做错了什么?

提前致谢。

1 个答案:

答案 0 :(得分:3)

根据这个answerinitialize方法的调用不会在构造函数中发生,而是在它之后发生。所以当你在子类的构造函数中调用afterInitialize时,它实际上是在initialize之前调用的!

  

用几句话说:首先调用构造函数,然后调用任何@FXML   填充带注释的字段,然后调用initialize()...

因此,当initialize被调用时,所有FXML元素都已加载,并且正如其他人建议的那样,您可以在afterInitialize方法中调用initialize,但如果您不想这样做,您可以使用@PostConstruct注释:

public abstract class ExampleClass implements Initializable {

    public void ExampleClass() {
        // Load FXML
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // Initialize stuff
    }

    @PostConstruct
    public void afterInitialize() {
        // Do things that are reliant upon the FXML being loaded
    }
}


public class ExampleSubclass extends ExampleClass {

    public ExampleSubclass() {
        super(/* real code has params */);
    }

    @PostConstruct
    @Override
    public void afterInitialize() {
         super.afterInitialize();
        // other things
    }
}