簡體   English   中英

超級初始化后,JavaFx調用super方法

[英]JavaFx call super method after super initialization

我有一個實現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應該已經被加載了。

我究竟做錯了什么?

提前致謝。

根據這個答案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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM