在阅读了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>
控制A.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 才能构造组件的属性值。但如果是这样,在使用组件之前以及在初始化所有道具之后初始化组件的最佳实践是什么?
最好的问候,尤金。