Ich möchte Bühnenereignisse (dh Verstecken) aus meiner Controller-Klasse behandeln. Alles was ich tun muss, ist einen Listener über hinzuzufügen
((Stage)myPane.getScene().getWindow()).setOn*whatIwant*(...);
Das Problem ist jedoch, dass die Initialisierung direkt danach beginnt
Parent root = FXMLLoader.load(getClass().getResource("MyGui.fxml"));
und davor
Scene scene = new Scene(root);
stage.setScene(scene);
Daher gibt .getScene () null zurück.
Die einzige Problemumgehung, die ich selbst gefunden habe, ist das Hinzufügen eines Listeners zu myPane.sceneProperty (). Wenn es nicht null wird, erhalte ich eine Szene, und füge es zu .windowProperty () hinzu. My! Goddamn! Hörer-Handling, das ich endlich abrufe. Und alles endet damit, dass die gewünschten Zuhörer auf Bühnenereignisse eingestellt werden. Ich denke, es gibt zu viele Zuhörer. Ist es der einzige Weg, mein Problem zu lösen?
load()
Methode übergeben. (Auch der Javadoc ongetController
klingt so, als ob er eingeschaltet sein solltesetController
.)Alles, was Sie brauchen, ist,
AnchorPane
einen Ausweis zu geben , und dann können Sie denStage
daraus erhalten.Von hier aus können Sie das hinzufügen
Listener
, was Sie benötigen.Bearbeiten: Wie von EarthMind unten angegeben, muss es nicht das
AnchorPane
Element sein; Es kann jedes Element sein, das Sie definiert haben.quelle
element
dies ein beliebiges Element mit einemfx:id
in diesem Fenster sein kann :Stage stage = (Stage) element.getScene().getWindow();
. Wenn Sie beispielsweise nur einButton
mit einemfx:id
in Ihren Fenstern haben, verwenden Sie dieses, um die Bühne zu erhalten.getScene()
kehrt immer noch zurücknull
.bgimage.sceneProperty().addListener((observableScene, oldScene, newScene) -> { if (oldScene == null && newScene != null) { bgimage.fitWidthProperty().bind(newScene.widthProperty()); ... } });
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:
2- Sie tun, was Sie tun müssen, wo Sie das erstellen
Stage
(und das ist nicht das, was Sie wollen):quelle
Der einfachste Weg, um ein Bühnenobjekt in der Steuerung abzurufen, ist:
Fügen Sie eine zusätzliche Methode in der selbst erstellten Controller-Klasse hinzu, z. B. (dies ist eine Setter-Methode zum Festlegen der Stufe in der Controller-Klasse).
Holen Sie sich den Controller in die Startmethode und stellen Sie die Bühne ein
Jetzt können Sie im Controller auf die Bühne zugreifen
quelle
stage
habe.Weisen Sie fx: id zu oder deklarieren Sie eine Variable für einen beliebigen Knoten: Anchorpane, Button usw. Fügen Sie dann einen Ereignishandler hinzu und fügen Sie in diesen Ereignishandler den folgenden Code ein:
Hoffe, das funktioniert bei dir !!
quelle
Platform.runLater verhindert die Ausführung, bis die Initialisierung abgeschlossen ist. In diesem Fall möchte ich jedes Mal eine Listenansicht aktualisieren, wenn ich die Fensterbreite verändere.
in deinem Fall
quelle
Sie können mit erhalten
node.getScene
, wenn Sie nicht von anrufenPlatform.runLater
, ist das Ergebnis ein Nullwert.Beispiel Nullwert:
Beispiel kein Nullwert:
quelle