# JFrame in Fenstermitte erzeugen



## julchen81 (26. Mrz 2008)

Hallo,

ich habe eine graphische Benutzeroberfläche mit einem JFrame erstellt.
Jetzt gibt's z.B. die Methode setLocation(int x, int y) oder auch setLocationRelativeTo(Component c)... aber keine ist meiner Meinung nach dazu geeignet, mein Fenster in der Mitte des Bildschirms anzuordnen.
Das Fenster soll natürlich auch nicht nur bei einer bestimmten Bildschirmgröße mittig angezeigt werden!

Wie bitte könnte man das hinkriegen?

LG Julia


----------



## SlaterB (26. Mrz 2008)

http://www.java-forum.org/de/viewtopic.php?t=8774


----------



## thE_29 (26. Mrz 2008)

Am besten ist man sagt!

setLocationRelativeTo(getParent());

Weil dann ist es beim ersten zentriert (da beim JFrame null zurückkommt) und bei den JDialog die auf dem JFrame aufsetzen, ist es dann zentriert zu dem Fenster und nicht vom ganzen Bildschirm!


----------



## Verjigorm (26. Mrz 2008)

thE_29 hat gesagt.:
			
		

> Am besten ist man sagt!
> 
> setLocationRelativeTo(getParent());
> 
> Weil dann ist es beim ersten zentriert (da beim JFrame null zurückkommt) und bei den JDialog die auf dem JFrame aufsetzen, ist es dann zentriert zu dem Fenster und nicht vom ganzen Bildschirm!



das geht bei mir nicht
das 2.fenster wird immer in der Bildschirmmitte angezeigt


----------



## Leroy42 (26. Mrz 2008)

```
setLocationRelativeTo(getParent());
```

 :shock: 

Wieder was dazugelernt!

Thx@the_29:  :toll:


----------



## julchen81 (26. Mrz 2008)

ist das hübsch!

Danke an alle, ich habe mich für die Lösung von SlaterB entschieden und es funktioniert wunderbar.

Julia


----------



## thE_29 (26. Mrz 2008)

Naja, es soll ja bei Parentfenster zentriert sein!

Wenn du ein Fenster mit 800x600 hast und ne Auflösung von 2560x1024 hast und das Bild dann in der Mitte vom Bildschirm auftaucht, obwohl es zu dem anderen Teil gehört, finde ich das eher störender!


Oder wenn du das Parentfenster wohin verschiebst um in der Mitte was frei zuhaben und du dann was andrückst im Parentwindow und dann der Dialog wieder in der Mitte ist obwohl das Parentfenster komplett woanders ist..

Ich weiß nicht! Da gefällt mir meine Version schon besser


----------



## Verjigorm (26. Mrz 2008)

thE_29 hat gesagt.:
			
		

> Naja, es soll ja bei Parentfenster zentriert sein!
> 
> Wenn du ein Fenster mit 800x600 hast und ne Auflösung von 2560x1024 hast und das Bild dann in der Mitte vom Bildschirm auftaucht, obwohl es zu dem anderen Teil gehört, finde ich das eher störender!
> 
> ...



genau das geht nicht


----------



## thE_29 (26. Mrz 2008)

Also bei mir geht das so!

Welche JRE Version verwendest du den?


----------



## Verjigorm (26. Mrz 2008)

Also ich weiss grad nicht, ob wir aneinander vorbeireden 

Wenn ich z.B. einen JFrame und einen JDialog habe
und den JDialog in der Mitte des JFrames öffnen will, dann bringt mir setLocationRelativeTo() nix


----------



## thE_29 (26. Mrz 2008)

Doch!

Wenn der JFrame das Parent vom JDialog ist, zentriert setLocationRelativeTo(getParent()); den JDialog zu dem Parent JFrame!

Bei mir arbeitet jedes Programm so!


----------



## L-ectron-X (26. Mrz 2008)

Du musst dem JDialog ja eine Referenz auf sein Elternfenster mitgeben. Diese Referenz kannst du gleich an die setLocationRelativeTo()-Methode übergeben. Also warum sollte man eine weitere Methode aufrufen, die eine Referenz auf das Parent-Fenster zurückgibt, wo man doch bereits diese Referenz hat?


----------



## thE_29 (26. Mrz 2008)

Weil ich im Konstruktor sowas nicht sage 

Bzw, ich einen JDialog mehrmals nutze!

Dh, ich sage erst in einer Methode, zB showDialog setLocationRelativeTo(getParent()) und dort habe ich die Instanz ja nicht mehr (wozu auch ). Aber ich will, falls man das Fenster verschiebt, eben auch den Effekt, dass der Dialog zentriert angezeigt wird!

Kleines Bsp


```
public Test extends JDialog
{
public Test(JFrame frame)
{
super(frame, true);
//do blabla things
setSize(300,300); //etc.. things what would not change
}

public boolean showDialog()
{
//do show things - change textfields, etc..
  setLocationRelativeTo(getParent()); //zentriert es zum Vater
setVisible(true);
}
```

Somit würde sich der Dialog immer zur Mitte vom Vater verhalten, auch bei mehrmaligen Aufrufen und beim Verschieben des Vaters


----------



## L-ectron-X (26. Mrz 2008)

Ich sehe keinen großen Unterschied zu der anderen Lösung und dass deine irgendetwas "besser" machen würde...
Auch im Verhalten sind sie gleich...


----------



## thE_29 (26. Mrz 2008)

Haha!!

Problem ist das zB bei diesem Bsp hier:


```
import javax.swing.*;
import java.awt.event.*;

public class Lex extends JFrame
{
private JDialog dlg  = null;

	public Lex()
	{
		JButton but1 = new JButton("HIT ME");
	    
		but1.addActionListener(new ActionListener()
		{
		public void actionPerformed(ActionEvent e)
		{
			if(dlg == null)
			{
				dlg = new JDialog(Lex.this, true);
				dlg.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
				dlg.setSize(300,300);		
			
			}
			System.out.println(">> " + getParent());
			dlg.setLocationRelativeTo(Lex.this); //MACHT DAS WAS ICH MEINTE
			dlg.setVisible(true);
		}
		});
		this.getContentPane().add(but1);
		this.setSize(400,400);
		this.setLocationRelativeTo(getParent());		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String args[])
	{
	new Lex();
	}
}
```

Irgendwie liefert getParent nicht den Parent zurück, sondern null! Dadurch zentriert er es in der Bildschirmmitte!! Bei mir daheim, wo ich aber den JDialog überschrieben habe (XDialog) liefert, getParent nicht null zurück, sondern den Vater!

Nachtrag: Wenn der "Hauptframe" auch schon ein JDialog ist, kommt bei getParent was zurück!!!

Also bei JDialog auf JDialog geht es. Also das hier:


```
import javax.swing.*;
import java.awt.event.*;

public class Lex extends JDialog
{
private JDialog dlg  = null;

	public Lex()
	{
		JButton but1 = new JButton("HIT ME");
	    
		but1.addActionListener(new ActionListener()
		{
		public void actionPerformed(ActionEvent e)
		{
			if(dlg == null)
			{
				dlg = new JDialog(Lex.this, true);
				dlg.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
				dlg.setSize(300,300);		
			
			}
			System.out.println(">> " + getParent());
			dlg.setLocationRelativeTo(getParent());
			dlg.setVisible(true);
		}
		});
		this.getContentPane().add(but1);
		this.setSize(400,400);
		this.setLocationRelativeTo(getParent());		
		this.setVisible(true);
		this.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
	}
	
	public static void main(String args[])
	{
	new Lex();
	}
}
```

Hoffe jetzt versteht man mich 

Verschiebt man den ersten Dialog nach links oben, so wird der 2te Dialog zentriert angezeigt!!

Warum das bei dem ollen JFrame nicht wirklich will, muss ich mal gucken.. Da es bei meinem XFrame auch funktioniert!


----------



## L-ectron-X (26. Mrz 2008)

Den ganzen Kram könntest du dir doch aber sparen, wenn du die Referenz, die du schon übergeben bekommst im Konstruktor nutzt.
Aber mir ist das eigentlich egal, ich sehe keinerlei Vorteile deiner Lösung...


----------



## thE_29 (27. Mrz 2008)

OMG!
Tut mir leid aber du willst es nicht kapiern oder?

Wenn ich den Dialog EINMAL anzeige, ist die Version mit der übergebenen Referenz OK! 

Man sag im Konstruktor setLocationRelativeTo und er zentriert es zum vorigen Dialog!

Erstes mal anzeigen geht Ok!

Ich schließe den Dialog (setVisible(false) und nicht dispose) und verschiebe den Hauptdialog.

So, wenn ich jetzt wieder setVisible sage steht der Dialog auf der alten Position und nicht mehr zentriert zum Vaterdialog!

Wenn man den wieder zentrieren will, sagt man setLocationRelativeTo(getParent()); 

Achja, ich hab mich beim vorigen Code geirrt! Es geht auch mit JFrame auf JDialog, nur getParent war ja immer getParent vom JFrame!!

Hier das Video zum Verstehen 
http://members.aon.at/taschek/lex.rar


```
import javax.swing.*;
import java.awt.event.*;

public class Lex extends JDialog
{
private JDialog dlg  = null;

	public Lex()
	{
		JButton but1 = new JButton("HIT ME");
	    
		but1.addActionListener(new ActionListener()
		{
		public void actionPerformed(ActionEvent e)
		{
			if(dlg == null)
			{
				dlg = new JDialog(Lex.this, true);
				dlg.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
				dlg.setSize(300,300);		
				//dlg.setLocationRelativeTo(Lex.this);//<dein Weg Lex - also es wird nur beim "Erstellen" (Konstruktor) wo man die Referenz hat, die Methode aufgerufen
			}
			dlg.setLocationRelativeTo(dlg.getParent()); //mein Weg ;-) -- jedesmal wenn es angezeigt wird, sagt man getParent() und er zentriert es immer neu
			dlg.setVisible(true);
		}
		});
		this.getContentPane().add(but1);
		this.setSize(400,400);
		this.setLocationRelativeTo(getParent());		
		this.setVisible(true);
		this.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
	}
	
	public static void main(String args[])
	{
	new Lex();
	}
}
```


----------

