Introduction_to_fxml を読んだ後、initialize メソッドを 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 メソッドから呼び出され、そのプロパティは後で呼び出される親の load メソッドから設定されます。親 fxml が読み込まれるまで、コンポーネントのプロパティ値を構築することはできません。しかし、もしそうなら、それが使用される前に、すべての小道具が初期化された後に、コンポーネントを初期化するベストプラクティスは何ですか?
よろしく、ユージーン。