Je sais que ce n'est pas la réponse que vous souhaitez, mais, selon moi, les solutions proposées ne sont pas bonnes (et votre propre solution l'est). Pourquoi ? Parce qu'elles dépendent de l'état de l'application. Dans JavaFX, un contrôle, une scène et une scène ne dépendent pas les uns des autres. Cela signifie qu'un contrôle peut vivre sans être ajouté à une scène et qu'une scène peut exister sans être attachée à un stage. Et puis, à un instant t1, un contrôle peut être attaché à une scène et à un instant t2, cette scène peut être ajoutée à un stage (et cela explique pourquoi ils sont des propriétés observables les uns des autres).
Ainsi, l'approche qui suggère de récupérer la référence du contrôleur et d'invoquer une méthode, en lui passant le stage, ajoute un état à votre application. Cela signifie que vous devez invoquer cette méthode au bon moment, juste après la création de la scène. En d'autres termes, vous devez suivre un ordre maintenant : 1- Créer la scène 2- Passer cette étape créée au contrôleur via une méthode.
Vous ne pouvez (ou ne devez) pas modifier cet ordre dans cette approche. Vous avez donc perdu l'apatridie. Et dans les logiciels, en général, l'état est un mal. Idéalement, les méthodes ne devraient pas nécessiter d'ordre d'appel.
Quelle est donc la bonne solution ? Il existe deux possibilités :
1- Votre approche, dans le contrôleur écouter les propriétés pour obtenir la scène. Je pense que c'est la bonne approche. Comme ceci :
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- Vous faites ce que vous devez faire là où vous créez la Stage
(et ce n'est pas ce que vous voulez) :
Stage stage = new Stage();
stage.maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
stage.setScene(someScene);
...