1

チェックボックス付きの非常に単純なfxmlファイルがあります。

...
<AnchorPane id="AnchorPane" xmlns:fx="http://javafx.com/fxml" fx:controller="jfx01.T01">
...
<CheckBox fx:id="checkBox1" text="CheckBox" />
...

非常に単純なコントローラ クラスは次のとおりです。

public class T01 extends Application {

    @FXML protected CheckBox checkBox1;

    @Override
    public void start(Stage primaryStage) throws IOException {
         Parent root = FXMLLoader.load(getClass().getResource("t01.fxml"));   
         primaryStage.setScene(new Scene(root));
         primaryStage.show();

         //here, here is the problem!
         System.out.println("checkBox1==null? "+ (checkBox1==null?"yes":"no"));

    }
}

この基本的なアプリの出力は次のとおりです。

checkBox1==null? yes

「start」メソッド内でコンポーネントが作成されることは明らかですが、コントローラ クラスの @FXML フィールドにはまだ割り当てられていません。他のエラーがないことをテストするために、ボタンとイベントを追加しました。そこにcheckBox1 ISが割り当てられています!

    @FXML protected void handleButton1Action(ActionEvent event) {
        System.out.println("button pressed");
        checkBox1.setSelected(!checkBox1.isSelected());
    }

質問

初期化がまだ完了していないために開始メソッドを使用できない場合、初期化が完了してコンポーネントが使用可能になる最初の方法は何ですか?

4

2 に答える 2

2

コントローラーはメソッドを実装javafx.fxml.Initializableしてオーバーライドする必要がありますinitialize(URL arg0, ResourceBundle res)。はCheckBox checkBox1FXMLLoader によって初期化され、そのinitializeメソッドで使用できるようになります。便利な方法は、コントローラーとメイン (アプリケーションを拡張する) クラスを分離することです。そのため、アプリの開始/エントリ ポイントと FXML ファイル コントローラーは 2 つの異なるクラスにする必要があります。

于 2012-07-02T16:23:47.907 に答える
1

これを使用して、コントローラーでメインステージにアクセスできます。

Node source = (Node) event.getSource();
Stage stage = (Stage) source.getScene().getWindow();
于 2012-08-27T16:11:52.610 に答える