Я знаю, що це не відповідь, яку ви хочете, але запропоновані рішення IMO не є хорошими (і ваш власний шлях). Чому? Оскільки вони залежать від стану програми. У JavaFX елемент керування, сцена та сцена не залежать один від одного. Це означає, що елемент керування може жити без додавання до сцени, а сцена може існувати без прикріплення до сцени. І тоді, в момент миттєвого t1, керування може приєднатись до сцени, і миттєво t2 ця сцена може бути додана до сцени (і це пояснює, чому вони є спостережуваними властивостями один одного).
Отже, підхід, який пропонує отримати посилання на контролер та викликати метод, передавши йому етап, додає стан до вашої програми. Це означає, що вам потрібно викликати цей метод у потрібний момент, відразу після створення етапу. Іншими словами, вам потрібно виконати порядок зараз: 1- Створити етап - Передати цей створений етап контролеру за допомогою методу.
Ви не можете (або не повинні) змінювати цей порядок у цьому підході. Отже, ви втратили апатрид. А в програмному забезпеченні загалом держава - це зло. В ідеалі методи не повинні вимагати жодного замовлення викликів.
То яке правильне рішення? Є дві альтернативи:
1- Ваш підхід у властивостях прослуховування контролера, щоб отримати сцену. Я вважаю, що це правильний підхід. Подобається це:
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- Ви робите те, що вам потрібно робити, де ви створюєте Stage
(і це не те, що ви хочете):
Stage stage = new Stage();
stage.maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
stage.setScene(someScene);
...