超级初始化后的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应该已经被加载了。
我在做什么错?
在此先感谢。
根据这个answer,调用initialize
方法不会发生在构造函数中,但在它之后。所以当你在子类的构造函数中调用afterInitialize
时,它实际上是在initialize
之前调用的!
几句话:构造函数首先被调用,那么任何@FXML 注释字段填充,然后初始化()被调用......
所以当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
}
}
这也许有用(http://zachxu.blogspot.gr/2016/09/java-annotation-postconstruct-and.html) – GOXR3PLUS
这绝对回答了我的问题,谢谢!我不知道@PostConstruct标签,因此阅读这些内容非常有帮助。 – user3668541
我很高兴它有帮助 – Omid
为什么ñ调用'this.afterInitialize();'initialize(..,...);'内部''只有这样你才能成功加载FXML。你的问题很有趣。 – GOXR3PLUS
通常这就是我要做的,但我需要从'ExampleSubclass'传递参数到'afterInitialize()'(可能应该指定在这个问题中,我的不好) – user3668541
其实这里提供的答案非常好,我din甚至不了解'@ PostConstruct'注释。 – GOXR3PLUS