JFrame: Auf Parentobjekt zugreifen

Palme4001

Grünschnabel
Hallo allerseits,

ich programmiere grade an meiner Facharbeit im Informatik LK herum, und bin dabei wiedermal auf ein Problem gestoßen, dass mich schon in vielen anderen Projekten belästigt hat.

Es handelt sich um ein kleines Programm zur Veranschaulichung des A Stern Algorythmus fuer die Wegfindung in Computerspielen.
Gierzu habe ich eine Klasse names "Karte" , inder der Algorythmus duchrläuft und den gefunden besten Weg auf einer Karte von 40x40 Bloecken in einem JFrame blau einfärbt. Das klappt auch alles soweit.

Die Klasse sieht brob so aus:

Code:
public Karte() {
		
		 fenster = new Fenster();

		 neueKarteErzeugen();
		
		 rasterBilden();
		
		randomKarte();
		
	}
	

	public void neueKarteErzeugen() {}
	
	public void randomKarte() {}
	
	public void rasterBilden() {}
	
	public void wandSetzen( int X , int Y ) {}
	
	 public void wandEntfernen( int X , int Y ) {}
	
	public void startSetzen( int X , int Y ) {}
	
	public void zielSetzen( int X , int Y ) {}
	
	public void resetKarte() {}
	
	public void aSternWertZuweisen( int zielX , int zielY ) {}
	
	public boolean istSackgasse() {}
	
	private int getXIndex( int knotenIndex ) {}
	
	private int getYIndex( int knotenIndex ) {}
	
	public int getLetztenIndex() {}
	
	public int getKleinsten() {}
	
	public Knoten getKnotenAusOpenList( int kleinster , int nummer ) {}
	
	private boolean istMehrfach( int kleinster , int nummer) {}

	protected void openListAusgeben( String Setting ) {}
	
	protected void closedListAusgeben( String Setting ) {}
	
	public void findeKuerzestenWeg( int startX , int startY , int zielX , int zielY ) {}

In dieser Klasse wird also ein JFrame erzuegt.

Die Klasse Fenster:
Code:
public class Fenster extends JFrame{
	
	JLabel[][] kachel = new JLabel[40][40];
	
	ImageIcon boden =  new ImageIcon(getClass().getResource("Boden.png"));
	ImageIcon stein = new ImageIcon(getClass().getResource("Stein.png"));
	ImageIcon rot = new ImageIcon(getClass().getResource("inClosedList.png"));
	ImageIcon gruen = new ImageIcon(getClass().getResource("inOpenList.png"));
	ImageIcon blau = new ImageIcon(getClass().getResource("Weg.png"));
	ImageIcon start = new ImageIcon(getClass().getResource("Start.png"));
	ImageIcon ziel = new ImageIcon(getClass().getResource("Ziel.png"));
	
	public Fenster() {
		
		super("aStern-Algorythmus");
		this.setVisible(true);
		this.setSize(1000, 828);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
		this.setResizable(false);
		
		terrain();
	}
	
	private void terrain() {
		
		for(int i = 0; i < 40; i++) {
			for(int j = 0; j < 40; j++) {
				kachel[i][j] = new JLabel();
				add(kachel[i][j]);
			}
		}
		
	}
	
	
}

Nun habe ich noch eine klasse names Test, welche die main-Methode beinhaltet, und ein Object der Klasse Karte erzeugt, somit das JFrame.

Nun möchte ich aber zB. in der Klasse Fenster einen MouseListener implementieren, mitdem man Steine, also eine Mauer auf der Karte setzen kann. dazu müssete ich dann aus dem MouseListener eine Methode der Klasse Karte aufrufen. Wenn ich nun aber ein Object der Klasse Karte in der Klasse Fenster erzuege, um Zugriff auf diese Methode zu erhalten, erzeugt diese wieder ein JFrame, da dies in "public Karte() { ... }" initialisiert wird.

Oder ich erzeuge eine eigene Klasse namens MouseHandler, die ich dann dem JFrame adde, aber da habe ich auch wieder das Problem, dass ich ohne ein Objekt der Klasse Karte anzulegen ja keinen Zugriff auf Methoden habe -.-

Diese Frage klingt jetzt wahrscheinlich ein bisschen dumm, aber wie kann ich es erreichen, den MouseListener und zB. den KeyListener außerhalb der Klasse Karte zu schreiben, ohne wieder zwangsweise ein 2. JFrame durch den Methodenaufruf zu erzeugen.

Dieses Problem habe ich bei eigentlich allen meinen GUI Anwendungen, und es endete immer damit, dass am Schluss so ziemlich alles in einer großen und unüversichtlichen Klasse stand.

Ich hoffe, ich habe die Frage einigermaßen verständlich formuliert.

Danke im Vorraus !
 
Hi und Willkommen bei tutorials.de

Bitte keine Fragen als Tutorials einreichen, Thread verschoben.

Zum Thema:
Wenn du in Karte das new Fenster anlegst, gib dem Konstruktor "this" mit.
Fenster nimmt das Kartenobjekt im Konstruktor und speichert es in irgendeine Klassenvariable.
Mit dem Listener in Fenster kannst du dann über die Variable auf die vorhandene Karte zugreifen.
 
Viele Dank fuer diese schnelle Antwort, sie hat mir echt weitergeholfen, und ich kann endlich wieder ordentlich an dem Projekt weiterschreiben :) !
 
Zurück