Optimieren einer Methode zum Zentrieren von Fenstern

MiMa

Top Contributor
In meinem Programm habe ich ein Hauptfesnter welches in der Regel geöffnet bleibt. Um beim Aufruf eines zweiten Fesnter wie "Über" oder "Einstellungen" möchte ich gerne das Fenster immer zum Hauptfenster zentriert anzeigen lassen. Also immer in der Mitte des Hauptfensters. Das soll auch funktionieren wenn das Fenster verschoben oder auf einen anderen Monitor platziert wird.
Dazu habe ich zwei Methoden geschrieben die beide funktionieren.

Java:
// Methode zum aufrufen des Einstellungen Fesnters

@FXML
    private void zeigeProgrammEinstellungen(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("EinstellungenFenster.fxml"));
            Parent root = loader.load();

            Stage einstellungenStage = new Stage();
            einstellungenStage.setTitle("Programmeinstellungen");
            einstellungenStage.setScene(new Scene(root));
            einstellungenStage.initModality(Modality.APPLICATION_MODAL);
            einstellungenStage.initOwner(hauptfensterStage);

           FensterTools.zentriereFenster(root, hauptfensterStage, einstellungenStage);
//            FensterTools.zentriereFenster1(hauptfensterStage, einstellungenStage);

            einstellungenStage.showAndWait();
        } catch (Exception e) {
            e.printStackTrace();
            // Fehlerbehandlung
        }

In der ersten Methode werden drei Parameter benötigt

Java:
public static void zentriereFenster(Parent root, Stage hauptFenster, Stage unterFenster){
        // Berechnung der Position für die Mitte des Hauptfensters
        double centerX = hauptFenster.getX() + hauptFenster.getWidth() / 2;
        System.out.println("Hauptfenster Mitte X : " + centerX);
        double centerY = hauptFenster.getY() + hauptFenster.getHeight() / 2;
        System.out.println("Hauptfenster Mitte y : " + centerY);

        // Breite und Höhe des Einstellungsfensters
        double width = root.prefWidth(0);
        System.out.println("Einstellungen Breite : " + width);
        double height = root.prefHeight(width);
        System.out.println("Einstellungen Höhe : " + height);

        // Berechnung der Position für das Einstellungsfenster
        double x = centerX - width / 2;
        System.out.println("Einstellungen Position X : " + x);
        double y = centerY - height / 2;
        System.out.println("Einstellungen Position y : " + y);

        // Setzen der Position und Größe für das Einstellungsfenster
        unterFenster.setX(x);
        unterFenster.setY(y);
        unterFenster.setWidth(width);
        unterFenster.setHeight(height);
    } // zentriereFenster

Ich würde Methode gerne auf nur zwei Parameter reduzieren und zwar auf das hauptFenster und das unterFenster und würde gerne auf den root knoten der vom Typ Pane ist verzichten.
Das Problem was ich habe ist, dass das unterFenster kein initialisiertes Stage Element ist, da es nur mit dem Show Befehl initialiser wird um Berechnungen durchführen zu können. Ich hatte mir überlegt es irgendwie in der Methode zu initialisieren ohne es an zeigen zu lassen. Ich habe es mit transperent und hide versucht aber funktioniert hat das eher nicht. Daher habe ich mal show und hide direkt ausgeführt um zu sehen ob dannach Berechnungen möglich sind.

Java:
public static void zentriereFenster1(Stage hauptFenster, Stage unterFenster){
        unterFenster.show();
        unterFenster.hide();
        // Berechnung der Position für die Mitte des Hauptfensters
        double centerX = hauptFenster.getX() + hauptFenster.getWidth() / 2;
        System.out.println("Hauptfenster Mitte X : " + centerX);
        double centerY = hauptFenster.getY() + hauptFenster.getHeight() / 2;
        System.out.println("Hauptfenster Mitte y : " + centerY);

        // Breite und Höhe des Einstellungsfensters
        double width = unterFenster.getWidth();
        System.out.println("Einstellungen Breite : " + width);
        double height = unterFenster.getHeight();
        System.out.println("Einstellungen Höhe : " + height);

        // Berechnung der Position für das Einstellungsfenster
        double x = centerX - width / 2;
        System.out.println("Einstellungen Position X : " + x);
        double y = centerY - height / 2;
        System.out.println("Einstellungen Position y : " + y);

        // Setzen der Position und Größe für das Einstellungsfenster
        unterFenster.setX(x);
        unterFenster.setY(y);
        unterFenster.setWidth(width);
        unterFenster.setHeight(height);
    } // zentriereFenster1

Ja es funktionier leider hat das den Pfaden beigeschmack eines Blitzen. Es wird kurz an alter Stelle angezeigt und dann wird es an neuer Stelle angezeigt.
Mein Ziel hätte ich damit erreicht, wenn das Blitzen nicht wäre.

Über vorschläge wäre ich dankbar.
 

Zurück
Oben