Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo Forum,
ich erkenne mit "maximizedProperty" die Fenster-Maximierung und möchte nun die neuen Fensterwerten (width, height) für die weitere Bearbeitung holen. Dabei stelle ich fest, dass diese Werte noch die ursprünglichen Werte sind. Wie komme ich an die neuen Werte?
FG Heinz
Java:
stage.maximizedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> prop,
Boolean oldValue, Boolean newValue) {
if (newValue) {
double w = stage.getWidth();
double h = stage.getHeight();
}
kannst du mal einen button programmieren der die Werte raus holt und den klickst du nach dem maximieren
kann mir vorstellen dass zu dem Zeitpunkt die Fenstergröße sich noch nicht geändert hat weil du noch im selben Frame bist von deinen FPS
aber das ist nur eine Annahme
So wie ich Dich verstanden habe, geht es Dir vor allem um Änderungen von Höhe und Breite. Dann würde ich auch die entsprechenden Properties verwenden: heightProperty und widthProperty.
Damit hast Du jede Änderung und kannst auf diese reagieren.
Denn was der Auslöser für eine Änderung ist, ist dir ja vermutlich egal. Wenn das Fenster im Vollbild-Modus ist und die Bildschirmauflösung sich ändert - das wäre doch ggf. ebenso interessant ... So Sonderfälle gibt es ja einige.
Daher wäre mein Ratschlag immer: Reagiere immer auf das, was wirklich das wichtige ist. Und das scheint mir jetzt weniger das Maximieren zu sein sondern mehr die Größenänderung.
Und noch ein allgemeiner Hinweis: Diese Pre-Java 8 Schreibweise von anonymen Klassen würde ich immer vermeiden, wenn es geht. Das ist unnötig viele Codezeilen und zudem extrem unübersichtlich.
ChangeListener ist ein funktionales Interface und kann damit mit Lambda Expression oder Methodenreferenz benutzt werden.
kannst du mal einen button programmieren der die Werte raus holt und den klickst du nach dem maximieren
kann mir vorstellen dass zu dem Zeitpunkt die Fenstergröße sich noch nicht geändert hat weil du noch im selben Frame bist von deinen FPS
aber das ist nur eine Annahme
Generell nur noch zum Verständnis:
Der Thread, der die Events bearbeitet (JavaFX Application Thread), verarbeitet das maximieren. Im Rahmen dieser Bearbeitung werden dann diverse Dinge gemacht:
Die Property maximized wird gesetzt --> Die löst sofort das Event aus - Daher noch keine neue Größe!
Die Property width wird gesetzt -> Die löst dann das nächste Event aus - da hast du noch nicht die veränderte Höhe
Dann wird die Höhe gesetzt -> Hier wären dann alle Werte vorhanden - so die Reihenfolge noch nicht verändert wurde.
Das Problem ist also, dass Diese Events ablaufen, obwohl die eigentliche Bearbeitung noch nicht abgeschlossen ist.
Da der Thread die Events einzeln nacheinander abarbeitet, können wir einfach dem Thread sagen, dass er später noch etwas machen soll. Das geht recht schön per Platform.runLater. Das bedeutet also, dass du den JavaFX Application Thread erst in Ruhe das Event zuende bearbeiten lässt und erst danach startet dann Dein Code.
Einfach mal ein kleines Beispiel, wie dies aussehen könnte:
Wir haben also einfach ein Fenster, das auf diverse Properties reagiert. Das printInfo dient in erster Linie dazu, das Problem zu zeigen (erste Zeile) um dann in der zweiten Zeile dann das runLater zu nutzen.
Das dient so nur der Visualisierung und zeigt dann auch eine mögliche Variante auf, wie Du vorgehen kannst, wenn Du erst nach der kompletten Bearbeitung eines Events etwas machen willst.
Edit: Im Code war noch etwas von einer Metadata Library drin - etwas, das ich mal kurz für einen anderen Thread brauchte ... habe ich dann noch heraus geworfen - hoffe, dass ich nichts übersehen habe.
So wie ich Dich verstanden habe, geht es Dir vor allem um Änderungen von Höhe und Breite. Dann würde ich auch die entsprechenden Properties verwenden: heightProperty und widthProperty.
Damit hast Du jede Änderung und kannst auf diese reagieren.
Denn was der Auslöser für eine Änderung ist, ist dir ja vermutlich egal. Wenn das Fenster im Vollbild-Modus ist und die Bildschirmauflösung sich ändert - das wäre doch ggf. ebenso interessant ... So Sonderfälle gibt es ja einige.
Daher wäre mein Ratschlag immer: Reagiere immer auf das, was wirklich das wichtige ist. Und das scheint mir jetzt weniger das Maximieren zu sein sondern mehr die Größenänderung.
Und noch ein allgemeiner Hinweis: Diese Pre-Java 8 Schreibweise von anonymen Klassen würde ich immer vermeiden, wenn es geht. Das ist unnötig viele Codezeilen und zudem extrem unübersichtlich.
ChangeListener ist ein funktionales Interface und kann damit mit Lambda Expression oder Methodenreferenz benutzt werden.
Danke,
mit den Propertys funktionierts nun. Die hatte ich auch schon für Höhe und Breite, habe aber nicht den "newVal" herangezogen sondern getWidth und dort steht noch der alte Wert. Das mit Lambda sehe ich mir noch an.
Generell nur noch zum Verständnis:
Der Thread, der die Events bearbeitet (JavaFX Application Thread), verarbeitet das maximieren. Im Rahmen dieser Bearbeitung werden dann diverse Dinge gemacht:
Die Property maximized wird gesetzt --> Die löst sofort das Event aus - Daher noch keine neue Größe!
Die Property width wird gesetzt -> Die löst dann das nächste Event aus - da hast du noch nicht die veränderte Höhe
Dann wird die Höhe gesetzt -> Hier wären dann alle Werte vorhanden - so die Reihenfolge noch nicht verändert wurde.