在阅读introduction_to_fxml后,我得到的印象是初始化方法可以用作spring的afterPropertiesSet或EJB的@PostConstruct方法 - 预期所有成员变量在调用时都会设置。但是当我尝试时,我得到了NPE。我尝试过的代码如下所示。
主要应用:
public class MyApp extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("/myapp.fxml"));///MAIN LOAD
Scene scene = new Scene(root, 320, 240);
scene.getStylesheets().add("/myapp.css");
stage.setScene(scene);
stage.setTitle("my app");
stage.show();
}
public static void main(String[] args) { launch(); }
}
myapp.fxml:
...
<VBox fx:id="root" xmlns:fx="http://javafx.com/fxml" >
<ControlA>
<SomeClass>
</SomeClass>
</ControlA>
</VBox>
ControlA.java:
@DefaultProperty("aproperty")
public class ControlA extends StackPane {
private SomeClass aproperty;
public ContentPane(){
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/controls/ControlA.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();//ControlA LOAD
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
public void initialize() {
//aproperty is null here, called from ControlA LOAD
}
//aproperty get/set
public void setAproperty(SomeClass p){//it is called from MAIN LOAD
....
}
组件的initialize方法是从其load方法调用的,其属性是从parent的load方法设置的,后者稍后调用它。并且它看起来可以理解,在读取父fxml之前无法构造组件的属性值。但是,如果是这样的话,在使用它之前以及在所有道具被初始化之后初始化组件的最佳做法是什么?
最好的问候,尤金。