0
讀完introduction_to_fxml之後,我得到一個印象,即initialize方法可以用作spring的afterPropertiesSet或EJB的@PostConstruct方法 - 期望所有成員變量在被調用時設置。但是當我嘗試時,我得到了NPE。我嘗試的代碼如下所示。初始化中的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
....
}
該組件的初始化方法是從它的負載方法調用,並且它的屬性是從稍後調用的父裝載方法設置。它看起來很容易理解,在讀取父fxml之前,組件的屬性值不能構造。但是如果是這樣的話,在組件初始化之前初始化一個組件的最佳實踐是什麼?
最好的問候,尤金。