1. ホーム
  2. java

[解決済み] JavaFX FXMLコントローラ - コンストラクタ vs. 初期化メソッド

2022-02-18 23:14:08

質問

私の Application クラスは次のようになります。

public class Test extends Application {

    private static Logger logger = LogManager.getRootLogger();

    @Override
    public void start(Stage primaryStage) throws Exception {

        String resourcePath = "/resources/fxml/MainView.fxml";
        URL location = getClass().getResource(resourcePath);
        FXMLLoader fxmlLoader = new FXMLLoader(location);

        Scene scene = new Scene(fxmlLoader.load(), 500, 500);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

があります。 FXMLLoader で指定した)対応するコントローラのインスタンスを作成します。 FXML ファイルビュア fx:controller ) を呼び出すと、まずデフォルトのコンストラクタを起動し、次に initialize メソッドを使用します。

public class MainViewController {

    public MainViewController() {
        System.out.println("first");
    }

    @FXML
    public void initialize() {
        System.out.println("second");
    }
}

と出力されます。

first
second

では、なぜ initialize メソッドは存在しますか?コンストラクタを使用する場合と initialize メソッドを使って、コントローラに必要なものを初期化することはできますか?

ご指摘ありがとうございます。

解決方法は?

一言で言えば コンストラクタが最初に呼び出され、次に任意の @FXML アノテーションされたフィールドに入力され、次に initialize() が呼び出される。

これは、コンストラクタが ない にアクセスすることができます。 @FXML フィールドは、.fxml ファイルで定義されたコンポーネントを参照しています。 initialize() が行います。 がアクセスできるようになりました。

から引用しています。 FXML入門 :

[...] コントローラは initialize() メソッドを定義することができます。これは、関連するドキュメントのコンテンツが完全に読み込まれたときに、実装するコントローラ上で一度呼ばれます [...] これにより、実装クラスはコンテンツに対して必要なあらゆる後処理を行うことができます。