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

问题描述:

我有一个实现了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尚未加载。这让我感到困惑,因为我先调用super()构造函数,所以我相信FXML应该已经被加载了。

我在做什么错?

在此先感谢。

+2

为什么ñ调用'this.afterInitialize();'initialize(..,...);'内部''只有这样你才能成功加载FXML。你的问题很有趣。 – GOXR3PLUS

+0

通常这就是我要做的,但我需要从'ExampleSubclass'传递参数到'afterInitialize()'(可能应该指定在这个问题中,我的不好) – user3668541

+1

其实这里提供的答案非常好,我din甚至不了解'@ PostConstruct'注释。 – GOXR3PLUS

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

几句话:构造函数首先被调用,那么任何@FXML 注释字段填充,然后初始化()被调用......

所以当initialize被称为所有FXML元素已经加载和其他人则建议,可以拨打afterInitializeinitialize方法,但如果你不想做,你可以使用@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