2016-12-02 10 views
1

私はInitializableを実装するクラスを持っています。スーパー初期化後のJavaFxコールスーパーメソッド

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がまだロードされていないかのようにしかし、それは動作します。これは私がスーパー()コンストラクタを最初に呼び出すときに私を混乱させるので、FXMLが既にロードされているはずだと私は信じています。

私は間違っていますか?

ありがとうございます。

+2

なぜnは'initialize(..、...);'の内部で 'this.afterInitialize();'を呼び出すことはできません。 FXMLが正常に読み込まれたのはあなただけです。あなたの質問は面白いです。 – GOXR3PLUS

+0

これは私がやっていることですが、 'ExampleSubclass'から' afterInitialize() 'にパラメータを渡す必要があります(おそらく、質問の中で私の悪いことを指定していたはずです) – user3668541

+1

実際に答えが優れています。 '@ PostConstruct'アノテーションについて知っていました。 – GOXR3PLUS

答えて

2

このanswerによれば、initializeメソッドの呼び出しは、コンストラクタではなく、その後に発生します。したがって、サブクラスのコンストラクタでafterInitializeを呼び出すと、実際にはinitializeの前に呼び出されます。いくつかの単語で

initializeはすべてFXML要素が呼び出されたときに、コンストラクタが最初に呼び出され、その後、任意の@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 
    } 
} 
+2

これは役に立つかもしれません(http://zachxu.blogspot.gr/2016/09/java-annotation-postconstruct-and.html) – GOXR3PLUS

+2

これは間違いなく私の質問に感謝しました!私は@PostConstructタグについては知らなかったので、それについて読むことはかなり役に立ちました。 – user3668541

+0

私はそれが助けてうれしい – Omid

関連する問題