# JFrame.setLocation()



## Java@home (15. Okt 2009)

Hallo Leute,
bin ganz neu hier wollte mich hier aber schon immer hier registrieren, da ich immer wieder beim suchen hier heimlich lese:rtfm:.
Komme mal zum Thema!
Ich habe eine Anwendung(JFrame->JTree, ist wie ein Explorer) aus der ich ganz normal Dateien(Bilder, Musik usw) öffnen kann, für jede Datei ein neues Fenster(JFrame).
Jetzt zu meiner Frage, wie kann man jedes Fenster(neu eröffnete) auch eine neue Location(von links oben nach rechts unten) vergeben, hat Swing da was parat, was ich so verzweifelt suche und wen nicht, hat einer ein Tipp wie ich es machen kann?
MFG


----------



## Meru (15. Okt 2009)

glaube das hieß 


```
JFrame frame = new JFrame();
frame.setLocationByPlatform(true);
```


----------



## Java@home (15. Okt 2009)

Meru hat gesagt.:


> glaube das hieß
> 
> 
> ```
> ...


Danke, aber :bahnhof: neee du, das klappt nicht und gibt sofort eine Exception
EDIT
Keine Exception mehr, jedeoch bring das nichts, leider!
Hat noch jemand eine Idee?
MFG


----------



## hdi (16. Okt 2009)

Tipp: Lass das mit den JFrames und kuck dir mal die Klasse JTabbedPane an. Damit hast du das Problem der Anordung/Übersichtlichkeit auch gleich erledigt. Statt also ein neues Frame zu machen addest du einfach ein neues Tab. Du kannst die Tabs auch anpassen, zB dass sie eine Schließ-Funktion haben. Also so wie es bei gängigen Browsern auch ist.


----------



## KrokoDiehl (16. Okt 2009)

```
frame.setLocation(Point);
frame.setLocation(int, int);
```


----------



## thE_29 (16. Okt 2009)

Zentriert: 
	
	
	
	





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

Zentriert es beim ersten Frame in die Mitte und bei den anderen relativ zum ParentWindow!


----------



## Java@home (16. Okt 2009)

Hi,
wow das werde ich mir mal gleich alles anschauen und ausprobieren, besonders das von hdi(da hast du mich auf eine Hammer Idee gebracht, mir hat es ja auch mit jede Mal neuen JFrame nicht gefallen), das werde ich als erstes ausprobieren! Danke für eure Hilfe!
MFG


----------



## Java@home (17. Okt 2009)

Hallo, das hat sich leider noch nicht erledigt, dass ganze muss mit einem JFrame(ich muss ein JFrame nehmen) funktionieren, hat noch jemand einen Tipp für mich wie ich es machen kann? 


> wie kann man jedes Fenster(neu eröffnete) auch eine neue Location(von links oben nach rechts unten) vergeben


 Ich habe eine MyJFrame Klasse von der alle Dokumente(die per z.B Doppelklick) eröffnet werden erben, natürlich habe ich auch eine Handler Klasse die von WindowAdapter erbt weil ich windowClosing windowOpened brauche, MyJFrame add natürlich this.addWindowListener(MyHandler);
So viel dazu, evtl. hat einer eine Idee!?
MFG


----------



## Michael... (19. Okt 2009)

Man könnte die Position des zu letzt geöffneten Frames in einer statischen Variablen speichern, und dann beim Öffnen des nächsten Frames die nächst mögliche Postion berechnen.


----------



## Java@home (19. Okt 2009)

Hi,
aha ja das hört sich ja toll an, aber wo soll ich die statische variable erstellen?
oder  ist es besser die in meinem Handler so erstellen 
	
	
	
	





```
public static Window w;
```
und wie geht es weiter, sry bin nicht so erfahren, vorallem bin ich noch nie so richtig auf den Genuss von static gekommen!
MFG
#Edit
So ich habe nun mal meine MyJFrame Klasse als static Variable gemacht und brauchte ein paar Castings, das ganze sieht nun so aus, aber ich weiß leider immer noch nicht, wie ich jedem Fenster eine Location + 30 setten kann

```
public class DokumentenAusgabeEventHandler extends WindowAdapter {
	
	List<Window> windowList = new ArrayList<Window>();
	
	public static MyJFrame frame;
	
	@Override
	public void windowClosing(WindowEvent we) {
		frame = (MyJFrame) we.getWindow();
		((MyJFrame)frame).ausgabeBeenden();
		frame.dispose();
		windowList.remove(frame);
		System.out.println("Window remmove " + frame);
		System.out.println("Ist die List leer = " + windowList.isEmpty() + windowList.indexOf(frame));
		System.out.println("List size " + windowList.size());
	}

	public void windowOpened(WindowEvent we) { 
		frame = (MyJFrame) we.getWindow();
		frame.setLocation(30, 30);
		windowList.add(frame);
		System.out.println("Window add " + frame.getName());
		System.out.println("Ist die List leer = " + windowList.isEmpty() + windowList.indexOf(frame));
		System.out.println("List size " + windowList.size());
		//System.out.println("MyJFrame" + MyJFrame.getFrames());
	}
	
	public void closeAllOpenWindow() {
		Iterator<Window> iterator = windowList.iterator();
		while(iterator.hasNext()) {
			Window w = iterator.next();
			((MyJFrame)w).ausgabeBeenden();
			w.dispose();
			iterator.remove();
		}
	}
	
	/*
	 * Erst nur probeweise, wird nicht verwendet!
	 * Die Idee war, alle Fenster die geöffnet werden, zu itirieren und sofort setLocation + 30
	 */
	public void windowsetLocation() {
		Iterator<Window> iterator = windowList.iterator();
		while(iterator.hasNext()) {
			Window w = iterator.next();
			((Window)iterator).setLocation(30, 30);
			//w.setLocation(w.getX() + 30, w.getY() + 30);
			System.out.println("Window activated " + w.getName());
		}
	}
		
}
```


----------



## Michael... (19. Okt 2009)

Da Du sowie so eine Klasse hast die das Öffnen und das Schliessen kontrolliert und von der es hoffentlich nur ein Objekt gibt, brauchst Du das mit der statischen Variable im Frame gar nicht, sondern kannst ja die letzte Position als Klassenmember dieses "Handlers" speichern.


----------



## Java@home (19. Okt 2009)

Michael... hat gesagt.:


> Da Du sowie so eine Klasse hast die das Öffnen und das Schliessen kontrolliert und von der es hoffentlich nur ein Objekt gibt, brauchst Du das mit der statischen Variable im Frame gar nicht, sondern kannst ja die letzte Position als Klassenmember dieses "Handlers" speichern.


Kannst du mir bitte das praktisch zeigen, ich verstehe leider nicht wie du das meinst:rtfm:
MFG


----------



## Michael... (19. Okt 2009)

Java@home hat gesagt.:


> ```
> public class DokumentenAusgabeEventHandler extends WindowAdapter {
> 
> List<Window> windowList = new ArrayList<Window>();
> ...


[JAVA=6]private int xPos = 30, yPos = 30;
...[/code]





Java@home hat gesagt.:


> [JAVA=18]public void windowOpened(WindowEvent we) {
> frame = (MyJFrame) we.getWindow();[/code]


[JAVA=20]frame.setLocation(xPos+=30, yPos+=30);[/code]

Prinzipiell sowas, muss halt nur noch überwachen, dass das Fenster nicht nach unten/rechts aus dem Bildschirm verschwinden.


----------



## Java@home (19. Okt 2009)

Du bist mein Held, genau das hatte ich auch schon versucht, aber ohne das = oO, vielen Dank Michael 
MFG


----------



## Java@home (22. Okt 2009)

Leider habe ich bei dem Ganzen einen Fehler heute entdeckt
Der Fehler ist folgender, 
1. wenn man ein Fenster schließt und gleich danach wieder eins auf macht, dann wird das nächste nicht an die Stelle von vorher platziert sondern sofort wieder die Location += 30 
2. Wenn ich alle Fenster mit meiner Methode  
	
	
	
	





```
public void closeAllOpenWindow()
```
 schließe dann platziert er das erste richtig aber auch nur weil ich 
	
	
	
	





```
private void windowSetLocation() {
			if (windowList.isEmpty()) {
				w.setLocation(Konstanten.LOCATION_DOKUMENT_AUSGABE);
			} else {
				w.setLocation(Konstanten.xPosWindow += 30, Konstanten.yPosWindow += 30);
			}
		}
	}
```
das so abfrage!
Wo ist den der Hacken, wer kann mir helfen?:autsch:

```
public static class MyEventHandler extends WindowAdapter {
		
		private static MyEventHandler myWindowListener = null;
		public static synchronized MyEventHandler getWindowListenerInstance() {
			if (myWindowListener == null) {
	            myWindowListener = new MyEventHandler();
	        }
	        return myWindowListener;
	    }

		List<Window> windowList = new ArrayList<Window>();
		
		private Window w;

		@Override
		public void windowClosing(WindowEvent we) {
			w = we.getWindow();
			((MyJFrame)w).ausgabeBeenden();
			w.dispose();
			windowList.remove(w);
			System.out.println("Window remmove " + w);
			System.out.println("Ist die List leer = " + windowList.isEmpty() + windowList.indexOf(w));
			System.out.println("List size " + windowList.size());
		}

		public void windowOpened(WindowEvent we) { 
			w = we.getWindow();
			this.windowSetLocation();
			windowList.add(w);
			System.out.println("Window add " + w.getName());
			System.out.println("Ist die List leer = " + windowList.isEmpty() + windowList.indexOf(w));
			System.out.println("List size " + windowList.size());
		}
		
		public void closeAllOpenWindow() {
			Iterator<Window> iterator = windowList.iterator();
			while(iterator.hasNext()) {
				Window w = iterator.next();
				((MyJFrame)w).ausgabeBeenden();
				iterator.remove();
				w.dispose();
			}
		}
		
		private void windowSetLocation() {
			if (windowList.isEmpty()) {
				w.setLocation(Konstanten.LOCATION_DOKUMENT_AUSGABE);
			} else {
				w.setLocation(Konstanten.xPosWindow += 30, Konstanten.yPosWindow += 30);
			}
		}
	}
```
Klasse Konstanten ist denke ich nicht weter relevant!?
MFG


----------



## Java@home (23. Okt 2009)

Kann keiner helfen?
Ich habe so ein Gefühl als wen die Window nach dem man die schließt noch immer existieren, aber das kann doch nicht sein, denn ich rufe doch immer schön 

```
w.dispose();
```
 auf.
Hat keiner einen Rat?
MFG


----------



## Michael... (23. Okt 2009)

Java@home hat gesagt.:


> Leider habe ich bei dem Ganzen einen Fehler heute entdeckt


 In diesem Fall macht das Programm genau das, was programmiert wurde. Wo ist da ein Fehler ;-)

Wenn Du die letzte Position "freigeben" möchtest, müsstest Du vor dem Schließen eines Fensters prüfen, ob dessen Position mit den Werten Deiner Konstanten übereinstimmt, um dann die Konstanten um 30 zu reduzieren.

Zu 2: hab ich jetzt nicht ganz verstanden, ob da ein Problem besteht. Wenn Du alle Fenster schliesst musst Du die Konstanten auf ihren Initialwert zurücksetzen.


----------



## Java@home (23. Okt 2009)

Würde das reichen, wenn ich im closing

```
p = new Point(Konstanten.xPosWindow -= 30, Konstanten.yPosWindow -= 30);
```
So setze ich die doch nach dem schließen auf -= 30 und das nähste nimmt dann die Position des geschlossenen ein, oder ist das auch doof?


> Wenn Du alle Fenster schliesst musst Du die Konstanten auf ihren Initialwert zurücksetzen.


Wie mache ich das?
einfach nur nach dem closeAllWindow

```
p = new Point(Konstanten.xPosWindow , Konstanten.yPosWindow);
```
und die sind wieder zurückgesetzt?
MFG


----------



## Michael... (23. Okt 2009)

Ich hab jetzt keine Ahnung wo Deine Points jetzt herkommen und was Du damit bezweckst. Du speicherst doch die letzte Position in den Konstanten, also musst Du die je nach Fall entsprechend manipulieren.

Hier mal ein Beispiel wie man sowas machen könnte wobei die Dialoge nach unten aus dem Bildschirm rauswandern können, aber dafür mit aufschliessen von Lücken wenn Dialoge dazwischen geschlossen werden:

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

public class WindowPositionDemo extends JFrame {
	private int x = 0, y = 0;
	private java.util.List<Window> winList;
	private DialogAdapter adapter;
	private int dialogCount = 0;

	public WindowPositionDemo() {
		winList = new ArrayList<Window>();
		adapter = new DialogAdapter();
		JButton button = new JButton();
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				JDialog dialog = new JDialog();
				dialog.setTitle("Dialog " + (++dialogCount));
				dialog.addWindowListener(adapter);
				dialog.setLocation(x += 30, y += 30);
				dialog.setVisible(true);
				winList.add(dialog);
			}
		});
		this.getContentPane().add(button, BorderLayout.EAST);
	}

	class DialogAdapter extends WindowAdapter {
		public void windowClosing(WindowEvent evt) {
			if (evt.getSource() instanceof JDialog) {
				winList.remove((JDialog) evt.getSource());
				x = 0;
				y = 0;
				for (int i = 0; i < winList.size(); i++) {
					winList.get(i).setLocation(x += 30, y += 30);
				}
			}
		}
	}

	public static void main(String[] args) {
		JFrame frame = new WindowPositionDemo();
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		frame.setBounds(d.width - 200, 0, 200, 150);
		// frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
```


----------



## Java@home (23. Okt 2009)

Das schaue ich mir doch glatt an, sieht nett aus, erst ein mal dankeschön und ich melde mich natürlich nachher:toll:
MFG
!Edit!

```
static class MyEventHandler extends WindowAdapter {
		
		private static MyEventHandler myWindowListener = null;
		public static synchronized MyEventHandler getWindowListenerInstance() {
			if (myWindowListener == null) {
	            myWindowListener = new MyEventHandler();
	        }
	        return myWindowListener;
	    }

		List<Window> windowList = new ArrayList<Window>();
		
		private Window w;

		@Override
		public void windowClosing(WindowEvent we) {
			w = we.getWindow();
			/*Habe die Schleife rausgenommen, da das ganze nicht so funktioniert, wie ich es gerne hätte*/
			/*x = Konstanten.xPosWindow;
			y = Konstanten.yPosWindow;
			for (int i = 0; i < windowList.size(); i++) {
                windowList.get(i).setLocation(x += 30, y += 30);
            }*/
			((MyJFrame)w).ausgabeBeenden();
			w.dispose();
			windowList.remove(w);
			System.out.println("Window remmove " + w);
			System.out.println("Ist die List leer = " + windowList.isEmpty() + windowList.indexOf(w));
			System.out.println("List size " + windowList.size());
		}

		public void windowOpened(WindowEvent we) { 
			w = we.getWindow();
			this.windowSetLocation();
			windowList.add(w);
			System.out.println("Window add " + w.getName());
			System.out.println("Ist die List leer = " + windowList.isEmpty() + windowList.indexOf(w));
			System.out.println("List size " + windowList.size());
		}
		
		public void closeAllOpenWindow() {
			Iterator<Window> iterator = windowList.iterator();
			while(iterator.hasNext()) {
				Window w = iterator.next();
				((MyJFrame)w).ausgabeBeenden();
				iterator.remove();
				w.dispose();
				x = Konstanten.xPosWindow;
				y = Konstanten.yPosWindow;
			}
		}
		
		public void windowSetLocation() {
			if (windowList.isEmpty()) {
				w.setLocation(x, y);
			} else {
				w.setLocation(x += 30, y += 30);
			}
		}
	}
```
Habe das jetzt erst ein mal so gelassen, klappt soweit nur die Schleife macht Probleme


----------

