JFrame in Fenstermitte erzeugen

Status
Nicht offen für weitere Antworten.

julchen81

Bekanntes Mitglied
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
 
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!
 
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
 
Code:
setLocationRelativeTo(getParent());

:shock:

Wieder was dazugelernt!

Thx@the_29: :toll:
 
ist das hübsch!

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

Julia
 
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 🙂
 
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!


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 🙂

genau das geht nicht
 
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
 
Doch!

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

Bei mir arbeitet jedes Programm so!
 
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?
 
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

Code:
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 😉
 
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...
 
Haha!!

Problem ist das zB bei diesem Bsp hier:

Code:
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:

Code:
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!
 
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...
 
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

Code:
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();
	}
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben