0

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 が読み込まれるまで、コンポーネントのプロパティ値を構築することはできません。しかし、もしそうなら、それが使用される前に、すべての小道具が初期化された後に、コンポーネントを初期化するベストプラクティスは何ですか?

よろしく、ユージーン。

4

1 に答える 1

0

コントローラーにInitializableインターフェイスを実装する必要があります。これはコントローラー専用だという印象を受けました。

于 2012-10-24T22:59:28.030 に答える