私はそれがあなたが望む答えではないことを知っていますが、IMO提案されたソリューションは良くありません(そしてあなた自身の方法はそうです)。どうして?アプリケーションの状態に依存するためです。JavaFXでは、コントロール、シーン、ステージは互いに依存しません。つまり、コントロールはシーンに追加せずにライブでき、シーンはステージに接続しなくても存在できます。次に、t1の時点でコントロールがシーンにアタッチされ、t2の時点でそのシーンをステージに追加できます(これにより、お互いの観測可能なプロパティがわかります)。
そのため、コントローラー参照を取得してメソッドを呼び出し、それにステージを渡すことを提案するアプローチは、アプリケーションに状態を追加します。つまり、ステージが作成された直後に、適切なタイミングでそのメソッドを呼び出す必要があります。つまり、今すぐ注文に従う必要があります。1-ステージを作成する2-この作成されたステージをメソッドを介してコントローラーに渡す。
このアプローチでは、この順序を変更することはできません(または変更しないでください)。だからあなたは無国籍を失った。そして、ソフトウェアでは、一般的に状態は悪です。理想的には、メソッドは呼び出し順序を必要としません。
それで、正しい解決策は何ですか?2つの選択肢があります。
1-あなたのアプローチ、ステージを取得するためのコントローラーのリスニングプロパティ。これは正しいアプローチだと思います。このような:
pane.sceneProperty().addListener((observableScene, oldScene, newScene) -> {
if (oldScene == null && newScene != null) {
// scene is set for the first time. Now its the time to listen stage changes.
newScene.windowProperty().addListener((observableWindow, oldWindow, newWindow) -> {
if (oldWindow == null && newWindow != null) {
// stage is set. now is the right time to do whatever we need to the stage in the controller.
((Stage) newWindow).maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
}
});
}
});
2-あなたはあなたがあなたが作成した場所であなたがする必要があることをしますStage
(そしてそれはあなたが望むものではありません):
Stage stage = new Stage();
stage.maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
stage.setScene(someScene);
...