JavaFx在超级初始化后调用超级方法

JavaFx在超级初始化后调用超级方法,java,javafx,initialization,fxml,super,Java,Javafx,Initialization,Fxml,Super,我有一个实现可初始化的类 public abstract class ExampleClass implements Initializable { public void ExampleClass() { // Load FXML } @Override public void initialize(URL location, ResourceBundle resources) { // Initialize stuff

我有一个实现可初始化的类

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

我做错了什么

提前感谢。

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

简而言之:首先调用构造函数,然后调用任何@FXML 填充带注释的字段,然后调用initialize()

因此,当调用
initialize
时,所有FXML元素都已加载,并且按照其他人的建议,您可以在
initialize
方法中调用
afterInitialize
方法,但如果您不想这样做,可以使用
@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
    }
}

为什么不调用
this.afterInitialize()内部
初始化(…)?只有这样,才能确保FXML已成功加载。你的问题很有趣。通常我会这么做,但我需要将参数从
ExampleSubclass
传递到
afterInitialize()
(可能应该在问题中指定“我的错”),实际上这里提供的答案很好,我甚至不知道
@PostConstruct
注释。这可能也很有用(),肯定回答了我的问题,谢谢!我不知道@PostConstruct标签,所以阅读它非常有帮助。我很高兴它有帮助