Wiem, że to nie jest odpowiedź, której chcesz, ale IMO proponowane rozwiązania nie są dobre (i twój własny sposób jest). Czemu? Ponieważ zależą od stanu aplikacji. W JavaFX kontrolka, scena i scena nie zależą od siebie. Oznacza to, że element sterujący może istnieć bez dodawania go do sceny, a scena może istnieć bez dołączenia do sceny. A następnie, w chwili t1, sterowanie może zostać dołączone do sceny, aw chwili t2, scena ta może zostać dodana do sceny (i to wyjaśnia, dlaczego są one wzajemnie obserwowalnymi właściwościami).
Zatem podejście, które sugeruje pobranie odwołania do kontrolera i wywołanie metody, przekazanie do niej etapu, dodaje stan do aplikacji. Oznacza to, że musisz wywołać tę metodę w odpowiednim momencie, zaraz po utworzeniu sceny. Innymi słowy, musisz teraz wykonać zamówienie: 1 - Utwórz etap 2 - Przekaż utworzony etap do sterownika metodą.
Nie możesz (lub nie powinieneś) zmieniać tej kolejności w tym podejściu. Więc straciłeś bezpaństwowość. W oprogramowaniu generalnie stan jest zły. W idealnym przypadku metody nie powinny wymagać żadnej kolejności wywołań.
Więc jakie jest właściwe rozwiązanie? Istnieją dwie możliwości:
1- Twoje podejście, we właściwościach odsłuchu kontrolera, aby dostać się na scenę. Myślę, że to właściwe podejście. Lubię to:
pane.sceneProperty().addListener((observableScene, oldScene, newScene) -> {
if (oldScene == null && newScene != null) {
newScene.windowProperty().addListener((observableWindow, oldWindow, newWindow) -> {
if (oldWindow == null && newWindow != null) {
((Stage) newWindow).maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
}
});
}
});
2- Robisz to, co musisz zrobić, gdzie tworzysz Stage
(a nie tego chcesz):
Stage stage = new Stage();
stage.maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
stage.setScene(someScene);
...