Ich weiß, es ist nicht die Antwort, die Sie wollen, aber IMO sind die vorgeschlagenen Lösungen nicht gut (und Ihr eigener Weg ist). Warum? Weil sie vom Anwendungsstatus abhängen. In JavaFX hängen ein Steuerelement, eine Szene und eine Bühne nicht voneinander ab. Dies bedeutet, dass ein Steuerelement ohne Hinzufügen zu einer Szene leben kann und eine Szene existieren kann, ohne an eine Bühne gebunden zu sein. Und dann kann zu einem Zeitpunkt t1 die Steuerung an eine Szene angehängt werden, und zum Zeitpunkt t2 kann diese Szene zu einer Bühne hinzugefügt werden (und das erklärt, warum sie beobachtbare Eigenschaften voneinander sind).
Der Ansatz, der vorschlägt, die Controller-Referenz abzurufen und eine Methode aufzurufen und die Stufe an diese zu übergeben, fügt Ihrer Anwendung einen Status hinzu. Dies bedeutet, dass Sie diese Methode im richtigen Moment direkt nach dem Erstellen der Bühne aufrufen müssen. Mit anderen Worten, Sie müssen jetzt einer Reihenfolge folgen: 1- Erstellen der Stufe 2- Übergeben Sie diese erstellte Stufe über eine Methode an die Steuerung.
Sie können (oder sollten) diese Reihenfolge bei diesem Ansatz nicht ändern. Sie haben also die Staatenlosigkeit verloren. Und in der Software ist der Zustand im Allgemeinen böse. Im Idealfall sollten Methoden keine Aufrufreihenfolge erfordern.
Was ist die richtige Lösung? Es gibt zwei Alternativen:
1- Ihr Ansatz, in den Controller Listening-Eigenschaften, um die Bühne zu bekommen. Ich denke, das ist der richtige Ansatz. So was:
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- Sie tun, was Sie tun müssen, wo Sie das erstellen Stage
(und das ist nicht das, was Sie wollen):
Stage stage = new Stage();
stage.maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
stage.setScene(someScene);
...