98

コントローラー クラスからステージ イベント (つまり、非表示) を処理したいと考えています。だから私がしなければならないのは、経由でリスナーを追加することだけです

((Stage)myPane.getScene().getWindow()).setOn*whatIwant*(...);

しかし問題は、初期化が直後に開始されることです

Parent root = FXMLLoader.load(getClass().getResource("MyGui.fxml"));

そして前に

Scene scene = new Scene(root);
stage.setScene(scene);

したがって、.getScene() は null を返します。

私が自分で見つけた唯一の回避策は、myPane.sceneProperty() にリスナーを追加することです。それが null でなくなったら、シーンを取得し、.windowProperty() に私の !goddamn! を追加します。最終的にステージを取得するリスナー処理。最後に、必要なリスナーを設定してイベントをステージングします。聞き手が多すぎると思います。それが私の問題を解決する唯一の方法ですか?

4

7 に答える 7

124

FXMLLoaderを介して初期化後にコントローラのインスタンスを取得できますが、静的メソッドを使用する代わりに をgetController()インスタンス化する必要があります。FXMLLoader

load()その後、コントローラーを直接呼び出した後、ステージを通過します。

FXMLLoader loader = new FXMLLoader(getClass().getResource("MyGui.fxml"));
Parent root = (Parent)loader.load();
MyController controller = (MyController)loader.getController();
controller.setStageAndSetupListeners(stage); // or what you want to do
于 2012-11-06T08:18:21.607 に答える
119

必要なのはAnchorPaneID を指定することだけで、そこから を取得できますStage

@FXML private AnchorPane ap;
Stage stage = (Stage) ap.getScene().getWindow();

ここから、必要なものを追加できListenerます。

AnchorPane編集: 以下の EarthMind で述べられているように、要素である必要はありません。定義した任意の要素にすることができます。

于 2015-07-28T20:48:07.853 に答える
2

Platform.runLater は、初期化が完了するまで実行を防止するように機能します。この場合、ウィンドウの幅を変更するたびにリスト ビューを更新したいと考えています。

Platform.runLater(() -> {
    ((Stage) listView.getScene().getWindow()).widthProperty().addListener((obs, oldVal, newVal) -> {
        listView.refresh();
    });
});

あなたの場合

Platform.runLater(()->{
    ((Stage)myPane.getScene().getWindow()).setOn*whatIwant*(...);
});
于 2020-01-23T14:31:58.750 に答える