Я знаю, что это не тот ответ, который вам нужен, но предлагаемые решения IMO не очень хороши (и ваш собственный путь). Зачем? Потому что они зависят от состояния приложения. В JavaFX элемент управления, сцена и этап не зависят друг от друга. Это означает, что элемент управления может существовать без добавления к сцене, а сцена может существовать без привязки к сцене. Затем в момент времени t1 элемент управления может быть прикреплен к сцене, а в момент t2 эта сцена может быть добавлена к сцене (и это объясняет, почему они являются наблюдаемыми свойствами друг друга).
Таким образом, подход, который предлагает получить ссылку на контроллер и вызвать метод, передав ему этап, добавляет состояние в ваше приложение. Это означает, что вам нужно вызвать этот метод в нужный момент, сразу после создания этапа. Другими словами, вам нужно выполнить порядок сейчас: 1- Создать этап 2- Передать этот созданный этап контроллеру с помощью метода.
Вы не можете (или не должны) изменять этот порядок при таком подходе. Итак, вы потеряли безгражданство. А в софте вообще состояние зло. В идеале методы не должны требовать какого-либо порядка вызова.
Так какое же правильное решение? Есть две альтернативы:
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);
...