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.
In der ersten Methode werden drei Parameter benötigt
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.
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.
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.