JavaFX Fenstergröße nach maximieren erkennen

hk

Bekanntes Mitglied
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();
        }
 
Y

yfons123

Gast
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
 

KonradN

Super-Moderator
Mitarbeiter
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.
 

hk

Bekanntes Mitglied
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
Hallo yfons123,
ja das würde funktionieren aber das löst mein Problem nicht. Ich brauche einen Listener der mir die neuen Werte bringt.
 

KonradN

Super-Moderator
Mitarbeiter
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:
Java:
package de.kneitzel;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class JavaFXApp extends Application {
    Stage stage;

    @Override
    public void start(Stage primaryStage) {
        stage = primaryStage;
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(e -> System.out.println("Hello World!"));

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.maximizedProperty().addListener((prop, o, n) -> printInfo("maximizedProperty"));
        primaryStage.heightProperty().addListener((prop, o, n) -> printInfo("heightProperty"));
        primaryStage.widthProperty().addListener((prop, o, n) -> printInfo("widthroperty"));
        primaryStage.show();
    }

    public void printInfo(String source) {
        System.out.println("Source: " + source + " (" + stage.getWidth()+ ", " + stage.getHeight() + ")");
        Platform.runLater(() -> printInfoLater("runLater " + source));
    }
    public void printInfoLater(String source) {
        System.out.println("Later from Source: " + source + " (" + stage.getWidth()+ ", " + stage.getHeight() + ")");
    }
    public static void main(String[] args) {
        launch(args);
    }
    
}

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.
 

hk

Bekanntes Mitglied
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.
 

hk

Bekanntes Mitglied
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 Beispiel trägt viel zu meinem Verständnis bei!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G jTable mit automatischer Zeilenhöhe je nach Fenstergröße. AWT, Swing, JavaFX & SWT 3
G Zeichnung verschwindet nach verändern der Fenstergröße. AWT, Swing, JavaFX & SWT 2
G Fenstergröße nur nach oben veränderbar einstellen AWT, Swing, JavaFX & SWT 7
M GUI-Repaint nach Änderung der Fenstergröße AWT, Swing, JavaFX & SWT 2
B JavaFX Bei Scenen-Wechsel im primaryStage wird aktuelle Fenstergröße nicht mit übernommen AWT, Swing, JavaFX & SWT 16
K JavaFX Fenstergröße ändert sich (Gluon - SceneBuilder) AWT, Swing, JavaFX & SWT 23
J JavaFX JavaFX Elemente an Fenstergröße skalieren AWT, Swing, JavaFX & SWT 5
K JavaFX Titel und Fenstergröße aus Main.java übergeben AWT, Swing, JavaFX & SWT 0
P Fenstergröße ändern, Panel soll gleich bleiben AWT, Swing, JavaFX & SWT 2
H preferred size abhängig von Fenstergröße berechnen AWT, Swing, JavaFX & SWT 11
J Java - dynamische Anpassung an Fenstergröße? AWT, Swing, JavaFX & SWT 4
W Swing Optimale Fenstergröße festlegen AWT, Swing, JavaFX & SWT 4
H Fenstergröße bei Mac und Windows gleich einstellen? AWT, Swing, JavaFX & SWT 3
P Swing Bild an Fenstergröße skalieren AWT, Swing, JavaFX & SWT 11
A Swing Fenstergröße mittels Menü verändern AWT, Swing, JavaFX & SWT 3
L Swing Fenstergröße setzen (Netbeans) AWT, Swing, JavaFX & SWT 6
B Fenstergröße automatisch skalieren AWT, Swing, JavaFX & SWT 7
N Swing Dynamisches Verhalten bei Änderung Fenstergröße AWT, Swing, JavaFX & SWT 6
T Swing jTextArea soll sich der Fenstergröße anpassen beim ziehen?? AWT, Swing, JavaFX & SWT 2
T LayoutManager GridBagLayout an Fenstergröße anpassen AWT, Swing, JavaFX & SWT 2
B Swing: letztes Element wird immer auf Fenstergröße gezogen AWT, Swing, JavaFX & SWT 3
S Swing Fenstergröße AWT, Swing, JavaFX & SWT 5
H JFrame minimale Fenstergröße AWT, Swing, JavaFX & SWT 7
T Feste Fenstergröße AWT, Swing, JavaFX & SWT 3
G Fenstergröße wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
B Fenstergröße anpassen AWT, Swing, JavaFX & SWT 7
P Frame - falsche Fenstergröße durch Rahmen? AWT, Swing, JavaFX & SWT 5
M Fenstergröße min/max? AWT, Swing, JavaFX & SWT 5
J Fixes Layout auf beliebige Fenstergröße skalieren AWT, Swing, JavaFX & SWT 2
M TextArea relativ zur Fenstergröße AWT, Swing, JavaFX & SWT 14
G Wie Fenstergröße während Fenstergrößenänderung auslesen? AWT, Swing, JavaFX & SWT 2
P SWT: Textfeld an Fenstergröße anpassen AWT, Swing, JavaFX & SWT 3
K Fenstergröße soll nicht verändert werden AWT, Swing, JavaFX & SWT 2
D Fenstergröße! AWT, Swing, JavaFX & SWT 17
F Listener für Fenstergröße (SWT) AWT, Swing, JavaFX & SWT 5
D JTable-Größe mit Fenstergröße verändern. AWT, Swing, JavaFX & SWT 4
F Fenstergröße in Swing setzen ? AWT, Swing, JavaFX & SWT 12
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18
T ListView nach Erweiterung Fehler in CellFactory AWT, Swing, JavaFX & SWT 8
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
VPChief Nach abspielen von Sound reagiert das Program nichtmehr AWT, Swing, JavaFX & SWT 9
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
S JavaFX Slider freezt nach Benutzung AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
F JavaFX Zustand der CheckMenuItems behalten nach Programmneustart AWT, Swing, JavaFX & SWT 7
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
stroggi Swing Suche nach Kurveneditor (UI-Element) AWT, Swing, JavaFX & SWT 1
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
MiMa Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
L JTextField erscheint erst nach Veränderung der Framegröße AWT, Swing, JavaFX & SWT 5
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
F AWT Robot Klasse Screenshot nach Pixelmustern in bestimmten Radius um Bildschirmmittelpunkt absuchen AWT, Swing, JavaFX & SWT 13
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben