Frames auf dem Bildschirm anordnen

Du solltest eine saubere getter-Methode für die Arraydaten schreiben, damit der von hammet beschriebene Fehler nicht so leicht auftreten kann ;)
 
WindowListener:
Java:
public class MyWindowListener2 implements WindowListener
{							   
	private JFrame jframe;
	
	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 },
	};
	
	public void windowClosing(WindowEvent e) {
		jframe.setVisible(false);	
		
	}

        ...

	public MyWindowListener2 (JFrame frame)
	{
		this.jframe = frame;
	}

Klasse1:
Java:
public class window_sec01beta extends FilesEinlesen {
	
	JFrame frame_01b = new JFrame("01-beta");
	MyWindowListener2 mywl2 = new MyWindowListener2(frame_01b);
	public int arraypoint;
	
	Panel panel = new Panel();
	
	public window_sec01beta() throws IOException {
		
		String[] array = this.e_s01b();
		
		JButton[] buttons = new JButton[20];
		
		frame_01b.setSize(140,500);
		
		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;
				this.arraypoint = i;
				break;
			}
		}

Klasse2 sieht im Prinzip aus wie Klasse1, nur dass der Frame anderst heisst. Also alles andere sonst exakt genau gleich.

Müsste ich den WindowListener anders aufrufen? Wenn ja, wird es problematisch, wiel der WindowListener macht mir meine kleinen Fensterchen, die ich die ganze Zeit positionieren will wieder invisible.
Ergo soll ich am besten das Positionenarray in eine andere, eigene Klasse setzen?
 
Wenn er von der 3. Klasse jeweils eine Instanz holt, hilft doch ein Getter auch nicht?

Entweder man gibt die Instanz weiter, oder man macht eine "Variablen-Klasse", die einen Static-Getter hat.

Ergo soll ich am besten das Positionenarray in eine andere, eigene Klasse setzen?

Ja unbedingt!
Das Array hat in einem Listener nichts zu suchen!
 
Ok erledigt.
Ich hab das ganze jetzt umgemodelt.

Es gibt nun eine Klasse FensterPositions:
Java:
public class FensterPositions {
	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 },
	};
}

Und Klasse1 und Klasse2 erben von FensterPositions:
Java:
public class window_sec01beta extends FensterPositions {
	
	JFrame frame_01b = new JFrame("01-beta");
	FilesEinlesen fe = new FilesEinlesen();
	MyWindowListener2 mywl2 = new MyWindowListener2(frame_01b);
	public int arraypoint;
	
	Panel panel = new Panel();
	
	public window_sec01beta() throws IOException {
		
		String[] array = fe.e_s01b();
		
		JButton[] buttons = new JButton[20];
		
		frame_01b.setSize(140,500);
		
		for (int i = 0; i < 18; i++) {
			if ( this.fensterpos[i][2] == 0) {
				frame_01b.setLocation(this.fensterpos[i][0],this.fensterpos[i][1]);
				this.fensterpos[i][2] = 1;
				this.arraypoint = i;
				break;
			}
		}

Aber: selbes Problem! Der Wert wird nicht auf 1 gesetzt, wenn ein Fenster geöffnet wird.

FRAGE: Was ist ein Getter? Was ein static-Getter?
 
Zuletzt bearbeitet:
Das Probelm besteht weiterhin, da du durch das Erben nicht das Array erbst, sondern die Struktur, d.h. jede Klasse hat wieder ihr eigenes Array.

Zum Thema Getter ein kleines Beispiel:

mainClass:
Java:
public class mainClass {

public static void main(String[] Arguments) {

ArrayClass arrayClass = new ArrayClass();
ExampleClass ex1 = new ExampleClass();
ExampleClass ex2 = new ExampleClass();

String[] tempArray = arrayClass.getArray();

ex1.ausgabe(tempArray);
ex2.ausgabe(tempArray);

}

}

ExampleClass:
Java:
public class ExampleClass {

public void ausgabe(String[] array) {

for(int i = 0; i < array.length; i++) {

System.out.println(array[i]);

}

}

}

ArrayClass:
Java:
public class ArrayClass {

public String[] array = new String[] {"test1","test2","test3"};

public String[] getArray() {

return(this.array);

}

}

Als kleine Hilfestellung ;)
Getter geben dir bestimmte Objekte/Variablen etc. zurück. Ein Getter ist also nichts anderes als eine Methode, die dir etwas zurückliefert.
 
Zuletzt bearbeitet:
Ok.
Stimmt, man kann es ja über get/set-Methoden verwalten das Array. Das wird jetzt aber n bisschen dauern, bis ich das gecodet hab. Ich post euch das Ergebnis, wenns soweit ist (falls es jemanden interessiert) :-)
 
Jungs, ihr seid klasse
Mit dem static-getter hats geklappt. Hatte zuerst einen non-static-getter, welcher mir aber wieder verschiedene Arrays ansprach. Mit dem kleinen, aber feinen Prefix "static" hats geklappt :-)

Danke!

Lösung:
Java:
public class FensterPositions {
	public static 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 },
	};
	
	public static int[] getFreePosi() {
		int[] position = new int[2];
		for (int i = 0; i < 18; i++) {
			if (fensterpos[i][2] == 0) {
				position[0] = fensterpos[i][0];
				position[1]	= fensterpos[i][1];
				fensterpos[i][2] = 1;
				break;
			}
		}
		return position;
	}
	
	public void status() {
		for (int k=0; k<5; k++) {
			System.out.println("Feld "+(k+1)+": "+fensterpos[k][2]);
		}
	}
}
 
Kann man machen, aber ziel der OOP ist es eigentlich static wenn möglich nicht zu gebrauchen. Das kommt aber mit der Programmiererfahren ;)

Wenn die Fragen jetzt geklährt sind, dann klicke doch noch bitte auf den Erledigt Button.
 
Wenn ich dich richtig verstehe sollte doch eigentlic ein Frame.setLocationByPlatform(true) genau das sein was du haben willst oder?

Gruß
sony2
 
Zurück