Frames auf dem Bildschirm anordnen

starbuck86

Mitglied
Hallo Community.

Ich schon wieder - aber jetzt im richtigen Unterforum...

Kurz zu meinem Programm:
Ich schreiben gerade an einem Server-Monitor in Java (momentan bin ich noch in der Oberflächengestaltung). In diesem Programm öffnet sich zu einer bestimmten Zeit für jeden Server ein neuer JFrame.

Das Problem ist, dass sich meine bspw. 16 JFrames alle auf dem gleichen Pixel öffnen. Wie kann man es implementieren, dass sich die Fenster gegenseitig anordnen. Also wie Windows es macht, wenn 10 Explorer geöffnet werden, stehen die ja auch nicht alle übereinander.

Ich hoffe ihr versteht was ich meine.

Gruß
Thomas
 
Du könntest beispielsweise einen Zählervariable anlegen, die bei jedem Erzeugen eines Fensters um z.b. 10 erhöht wird. Diesen Zähler kannst du ja jeweils auf den X und/oder Y Wert eines jeden neuen Fensters addieren.

Edit.: Natürlich aufpassen, dass die Fenster nicht aus dem Bildschirm hinaus gehen ^^
 
Zuletzt bearbeitet:
Da werde ich allerdings das Problem bekommen, dass, wenn die Fenster wieder geschlossen werden und ich vom Zähler 10 abziehe, eine Position entsteht, die möglicherweise schon von einem von einem anderen Fenster belegt ist.

Ich denke ich könnte es dann über Fensterpostitionen machen. Dass ich x und y Werte als Konstanten definiere und mir so zB 22 Fensterpositionen zurechtbastel mit nem Trigger (belegt/nicht belegt).
Aber das ist ja n Haufen Schreibarbeit. Gibts da nicht schon was vorgefertigtes?
 
Zuletzt bearbeitet:
Hol dir die Referenz zum Aktuellen Frame der den Focus hat(Wenn das geht nicht nachgeschaut).

Und hol mit getLocation(); deine Aktuellen Koordinaten und setzt das neue Fenster mit
Java:
setLocation(new Point(oldx + 20, oldy + 20));

Würde das infrage kommen ?
 
Wenn ich Deine Antwort richtig verstanden habe, läuft es im Endeffekt aufs gleiche raus, was Matze gesagt hat.

Ich hab jetzt mal nachgezählt. Ich hab genau 18 Fenster (f1, f2, f3, f4, ...), die unabhängig von einander einfach mal auf und nach ein paar Sekunden wieder zu gehen.

Also gehen wir mal von einem fiktiven Fall A aus:
Ausgangsposition ist 100/100!
  • f1 öffnet sich auf Position x=100 y=100
  • f2 öffnet sich auf Position x=120 y=120
  • f3 öffnet sich auf Position x=140 y=140
  • f4 öffnet sich auf Position x=160 y=160
  • f2 schließt sich, Position x=120 y=120 FREI
  • f5 öffnet sich auf Position x=180 y=180
  • ...

Weisst Du was ich meine? Es wird eine Position geschaffen die gar nicht genutzt werden kann, da der Zähler schon 5 Positionen weiter ist.
 
Dann nimm doch einen WindowsListener und hol dir immer bevor ein Fenster "wirklich" geschlossen wird die Location und speicher diese als frei ab. Und das nächste fenster was geöffnet wird, benutzt dann einen vorhandenen freien Platz.
 
Ne Matze will eine Variable benutzen die er hochzähl ich benutz ein Vorhandes Fenster und Orientier mich dadran.
Dann leg halt ein Vector an Speicher die ganzen Referenzen darein schau bei jeden aufruf nach ob ein Fenster geschlossen ist wenn ja übernimmst du die Locations von dem geschlossenen wenn nein dann setzt du es an einen Platz wo noch kein Fenster ist auch über den gefüllt Vector möglich.
 
Java:
	public int[][] fensterpos = {
			// Format {<xpos>,<ypos>,<belegt=1/nichtbelegt=0>}
			// 1. Reihe
			{ 200, 284, 0 }, { 250, 334, 0 },
			{ 300, 384, 0 }, { 350, 434, 0 },
			{ 400, 484, 0 }, { 450, 534, 0 },
			// 2. Reihe
			{ 350, 284, 0 }, { 400, 334, 0 },
			{ 450, 384, 0 }, { 500, 434, 0 },
			{ 550, 484, 0 }, { 600, 534, 0 },
			// 3. Reihe
			{ 500, 284, 0 }, { 550, 334, 0 },
			{ 600, 384, 0 }, { 650, 434, 0 },
			{ 700, 484, 0 }, { 750, 534, 0 },
	};

So sehen die Fensterpositionen aus, die in meinem WindowListener alias mywl2 stehen.
Jetzt greife ich aus 2 unterschiedlichen Klassen auf dieses Array zu.

Klasse 1:
Java:
		for (int i = 0; i < 18; i++) {
			if ( mywl2.fensterpos[i][2] == 0) {
				frame_01b.setLocation(mywl2.fensterpos[i][0],mywl2.fensterpos[i][1]);
				mywl2.fensterpos[i][2] = 1;
				break;
			}
		}

Klasse2:
Java:
		for (int i = 0; i < 18; i++) {
			if ( mywl2.fensterpos[i][2] == 0) {
				frame_02b.setLocation(mywl2.fensterpos[i][0],mywl2.fensterpos[i][1]);
				mywl2.fensterpos[i][2] = 1;
				break;
			}
		}

Normalerweise sollte, nachdem Klasse1 auf das Positionenarray zugegriffen hat, die 1. Position mit belegt versehen werden (1). Sobald aber Klasse 2 auf das Array zugreift, ist die Belegung seltsamerweise frei (0).
Kann es sein, dass sich die Klassen sozusagen eigene Abbilder dieses Arrays zur Laufzeit in ihrem Speicherbereich anlegen und gar nichts voneinander wissen? Das wäre ja blöd.

Gruß
Thomas
 
Das kommt drauf an wo du das Array hast und wie du darauf zugreifst. Wenn es in einer 3. Klasse liegt und du in Klasse 1 + 2 jeweils eine neue Instanz der 3. Klasse erzeugst sind das 2 unterschiedliche Arrays. Es gibt mehrer Möglichkeiten.
Ein bisschen mehr Code/beschreibung wäre hilfreich ;)
 

Neue Beiträge

Zurück