Je sais que ce n'est pas la réponse que vous voulez, mais à l'OMI, les solutions proposées ne sont pas bonnes (et à votre façon). Pourquoi? Parce qu'ils dépendent de l'état de l'application. Dans JavaFX, un contrôle, une scène et une étape 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 à une scène. Et puis, à un instant t1, le contrôle peut s'attacher à une scène et à l'instant t2, cette scène peut être ajoutée à une étape (et cela explique pourquoi ce sont des propriétés observables l'une de l'autre).
Ainsi, l'approche qui suggère d'obtenir la référence du contrôleur et d'appeler une méthode, en lui passant l'étape ajoute un état à votre application. Cela signifie que vous devez appeler cette méthode au bon moment, juste après la création de la scène. En d'autres termes, vous devez maintenant suivre un ordre: 1- Créez l'étape 2- Passez cette étape créée au contrôleur via une méthode.
Vous ne pouvez pas (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 mauvais. Idéalement, les méthodes ne devraient nécessiter aucun ordre d'appel.
Alors, quelle est la bonne solution? Il existe deux alternatives:
1- Votre approche, dans les propriétés d'écoute du contrôleur pour obtenir la scène. Je pense que c'est la bonne approche. Comme ça:
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 le 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);
...