Zugreifen auf JPanel

ttmgot

Mitglied
Hi,

ich bin neu in diesem Forum und kenne mich mit Swing-Programmierung noch nicht so gut aus:

Ich brauche ein JFrame innerhalb von dem ich mehrere Rechtecke zeichne und die Anzahl der Rechtecke soll sich verändern wenn sich die Fenstergröße ändert.Dazu habe ich eine Kindklasse von JPanel erstellt und die paintComponent Methode überschrieben. Die überschriebene paintComponent Methode macht das mit einen zweidimensionalen Arrays:

Sieht so aus:

[JAVA=53]
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
// boolean[][] Kopie = new boolean[this.getSize().height][this.getSize().width];
//
// for(int x=0; x<feld.length; x++){
// for(int y=0; x<feld[x].length; y++){
//
// while(x < Kopie.length && y < Kopie[x].length){
// Kopie[x][y]= feld[x][y];
// }
//
// }
// }

// feld = Kopie;
for(int x = 0; x < feld.length; x++){
for(int y = 0; y < feld[0].length; y++){
if(feld[x][y]){
g.setColor(Color.RED);
}else{
g.setColor(Color.BLACK);
}
g.fillRect(x*10, y*10, 9, 9);

}

}
}
[/code]
Dass mit dem Fenstergröße ändern, habe ich in der paintComponent Methode versucht, aber dabei hat sich das Programm immer aufgehängt.

Also habe ich versucht, diese Methode in in einem HierarchyBoundsListener innerhalb vom Konstruktor zu setzen, sodass er die Arraylänge nach jeder Größenänderung neu berechnet.

Dass sieht dann so aus:
[JAVA=18]
public Rechteck(boolean[][] feld){
this.feld = feld;
this.addHierarchyBoundsListener(new HierarchyBoundsListener(){

@Override
public void ancestorMoved(HierarchyEvent e) {
System.out.println("moved");

}

@Override
public void ancestorResized(HierarchyEvent e) {

boolean[][] Kopie = new boolean[this.getSize().height][this.getSize().width];

for(int x=0; x<feld.length; x++){
for(int y=0; x<feld[x].length; y++){

while(x < Kopie.length && y < Kopie[x].length){
Kopie[x][y]= feld[x][y];
}

}
}

feld = Kopie;
}

});
}
[/code]

Blöderweise greift dass Programm jetzt bei this natürlich nicht auf dass Panel (also hier die Klasse Rechteck) zu sondern auf den Listener.

Gibt es irgendeine möglichkeit auf das Panel innerhalb vom Listener wieder auf das Panel zuzugreifen???:L
 

Marco13

Top Contributor
Schreib' dir erstmal eine utility-Methode
Java:
public static boolean[][] createCopy(boolean input[][], int newSizeX, int newSizeY)
oder so.

Und dann... poste mal mehr code. Vermutlich könnte man einen ComponentListener verwenden....
 

ttmgot

Mitglied
Erstmal danke für die schnelle Antwort.
Hier ist die komplette Kind-klasse von JPanel (ich hoffe, sie ist verständlich genug kommentiert):
Java:
public class Rechteck extends JPanel{
	
	static private boolean[][] feld;
	
	public Rechteck(boolean[][] feld){
		this.feld = feld;
		// Der Listener bemerkt ob das JFrame vergroeßert oder verkleinert wurde
		this.addHierarchyBoundsListener(new HierarchyBoundsListener(){

				@Override
				public void ancestorMoved(HierarchyEvent e) {
					System.out.println("moved");
					
				}

				@Override
				public void ancestorResized(HierarchyEvent e) {
					/* Diese Methode soll die Menge der Zellen anpassen
					 * wenn das JFrame veraendert wurde, wie in
					 * feld = createCopy(feld, Rechteck.getSize().height, Rechteck.getSize().width);
					*/
				}
		    	
		    });
	}
	
	//vorgeschlagene utility-Methode
	public static boolean[][] createCopy(boolean[][] input,int newSizeX, int newSizeY){
		boolean Copy[][] = new boolean[newSizeX][newSizeY];
		
		for(int x = 0; x < input.length; x++){
			for(int y = 0; y < input[x].length; y++){
				while(x < Copy.length && y < Copy[x].length){
					Copy[x][y]=input[x][y];
				}
			}
		}
		
		return Copy;
	}
	
	
	
	
	@Override
	public void paintComponent(Graphics g){
		//paintComponent-methode überschrieben
		super.paintComponent(g);

		for(int x = 0; x < feld.length; x++){
			for(int y = 0; y < feld[0].length; y++){
				if(feld[x][y]){
					g.setColor(Color.RED);
				}else{
					g.setColor(Color.BLACK);
				}
				g.fillRect(x*10, y*10, 9, 9);
			//zeichnet Zellen ein
			}
			
		}
	}

Dass Problem ist jetzt, dass ich vom Listener aus, nicht mehr auf das JPanel zugreifen kann.

Außerdem bin ich mir nicht sicher, ob es intelligenter ist, den Listener in den Konstruktor zu setzen, oder erst in das JFrame.

Das JFrame-Klasse sieht so aus:
Java:
public class GUITest extends JFrame{
	
    boolean[][] myColorField;
	private Rechteck rechteck;
	int frameWidth;
	int frameHeight;
	
	public GUITest(Rechteck rechteck, int frameWidth, int frameHeight){
		this.frameHeight =frameHeight;
		this.frameWidth = frameWidth;
		this.rechteck = rechteck;
		this.setTitle("Test");
	    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	    setSize(frameWidth, frameHeight);
	    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	    int x = (d.width - getSize().width) / 2;
	    int y = (d.height - getSize().height) / 2;
	    setLocation(x, y);
	    
	    
	    Container cp = getContentPane();
	    cp.setLayout(new BorderLayout());

	    
	    rechteck.setBackground(Color.WHITE);
	    cp.add(rechteck);
	
	setResizable(true);
	setVisible(true);

	}
	
}

Ich hab mir auch in der Java-Api Component-Listener durchgelesen, versteh aber noch nicht ganz, wie der das Problem umgehen kann?
 

Marco13

Top Contributor
Dass Problem ist jetzt, dass ich vom Listener aus, nicht mehr auf das JPanel zugreifen kann.

Ahso... sorry, erst war nicht klar, was du meintest mit dem "Zugriff" - in dem Fall gab's zwei Probleme: Erstens war das 'feld' static (das war nicht ursächlich für das Problem, sollte aber nicht so sein), und wichtiger: Innerhalb des Listeners wußte er nicht mehr, ob der Parameter 'feld' gemeint war, oder die Variable 'feld' aus der Rechteck-Klasse, und hat deswegen gesagt ~'can not refer to non-final variable' oder so (In Zukunft immer gleich eventuelle Fehlermeldungen mit angeben, das macht das Antworten leichter).

Man könnte ihm an dieser Stelle sagen, welches 'feld' gemeint ist: Wenn man das 'feld' aus Rechteck meint, kann man statt 'feld' schreiben: [c]Rechteck.this.feld[/c]. Einfacher ist es aber, wenn man den Parameter 'feld' im Konstruktor anders nennt...


Hier das ganze nochmal als KSKB, auch mit einem ComponentListener:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Rechteck extends JPanel {

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				JFrame f = new JFrame("Test");
				f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				boolean initial[][] = new boolean[50][50];
				for (int i = 0; i < 50; i++) {
					for (int j = 0; j < 50; j++) {
						initial[i][j] = Math.random() < 0.5;
					}
				}
				Rechteck rechteck = new Rechteck(initial);
				f.getContentPane().add(rechteck);
				f.setSize(500, 500);
				f.setVisible(true);
			}
		});
	}

	private boolean[][] feld;

	public Rechteck(boolean[][] feldEingabe) {
		this.feld = feldEingabe;

		// Der Listener bemerkt ob das Rechteck vergroeßert oder verkleinert wurde
		this.addComponentListener(new ComponentAdapter() {

			@Override
			public void componentResized(ComponentEvent e) {
				int sx = getWidth() / 10;
				int sy = getHeight() / 10;
				System.out.println("Resizing to " + sx + " " + sy);
				feld = createCopy(feld, sx, sy);
			}
		});
	}

	// vorgeschlagene utility-Methode
	private static boolean[][] createCopy(boolean input[][], int newSizeX, int newSizeY) {
		boolean result[][] = new boolean[newSizeX][newSizeY];
		int sx = Math.min(input.length, newSizeX);
		for (int i = 0; i < sx; i++) {
			int sy = Math.min(newSizeY, input[i].length);
			System.arraycopy(input[i], 0, result[i], 0, sy);
		}
		return result;
	}

	@Override
	public void paintComponent(Graphics g) {
		// paintComponent-methode überschrieben
		super.paintComponent(g);

		for (int x = 0; x < feld.length; x++) {
			for (int y = 0; y < feld[0].length; y++) {
				if (feld[x][y]) {
					g.setColor(Color.RED);
				} else {
					g.setColor(Color.BLACK);
				}
				g.fillRect(x * 10, y * 10, 9, 9);
				// zeichnet Zellen ein
			}

		}
	}
}


Aaaaaber: Du solltest mal genauer beschreiben, was du vorhast ... meine Kristallkugel sagt was vom "Spiel des Lebens", aber die irrt sich manchmal ;) Trotzdem ist das in dieser Form mit ziemlicher Sicherheit nicht das, was du willst.... Dass das Erstellen der größeren Array-Kopie von der Componentengröße abhängt ist sehr seltsam und suspekt ... :noe:
 

ttmgot

Mitglied
Erstmal nochmal ein dickes Dankeschoen:applaus:
Find ich toll, dass es Leute gibt die sich die Zeit nehmen, um sich mit den Problemen von anderen zu beschaeftigen.
Zweitens, entschuldige bitte, dass ich mein Problem nicht genau genug beschrieben hab. Deine Kristallkugel hat recht, und es haengt wirklich mit dem Game of Life zusammen, und außerdem ist es wirklich bloed, dass die Zellenanzahl von der Fenstergroeße abhaengt, aber das ist nun mal leider die Aufgabenstellung,

Weiss auch nicht wer sich sowas ausdenkt:noe:

Also danke nochmal fuer die Loesung des Problems und ausserdem habe ich so viele neue Programmiertricks gelernt.:toll:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Auf angeklicktes JPanel zugreifen Java Basics - Anfänger-Themen 5
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
frager2345 Fensterklasse, Wie auf Frame im Listender zugreifen (ItemEvents) Java Basics - Anfänger-Themen 7
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
O Mit Instanz von Oberklasse auf Unterklasse zugreifen Java Basics - Anfänger-Themen 2
S Kann nicht auf die Liste zugreifen mit der Methode!? Java Basics - Anfänger-Themen 3
C Auf die Methode einer anderen Klasse zugreifen Java Basics - Anfänger-Themen 1
Vivien Auf eine Variable von einer anderen Klasse aus zugreifen Java Basics - Anfänger-Themen 3
T Auf Instanz der selben Klasse aus überschriebener Methode in Methode zugreifen. Java Basics - Anfänger-Themen 2
S Aus verschachtelter ArrayList auf einen Wert zugreifen Java Basics - Anfänger-Themen 4
F Auf Variablen eines Konstruktors zugreifen Java Basics - Anfänger-Themen 4
C Methoden können nicht auf Instanzvariable der Klasse zugreifen Java Basics - Anfänger-Themen 3
itsmejo Erste Schritte Auf Attribut einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 14
S Auf Array aus Objekten zugreifen? Java Basics - Anfänger-Themen 1
S Auf Methode einer anderen Klasse zugreifen Java Basics - Anfänger-Themen 3
M Auf erstelltes Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 5
N Mit Objekt der Superklasse auf Methode der Subklasse zugreifen Java Basics - Anfänger-Themen 6
N Klassen Warum kann meine Klasse nicht auf Methoden der anderen Klasse zugreifen? Java Basics - Anfänger-Themen 6
A Auf Eigenschaften von Objekten anderer Klassen zugreifen Java Basics - Anfänger-Themen 5
M Auf einen Array innerhalb eines Objekts zugreifen Java Basics - Anfänger-Themen 5
X Auf Attribut einer anderen Klasse zugreifen Java Basics - Anfänger-Themen 2
H Auf Objekte bzw Variabeln aus einer anderen Methode zugreifen Java Basics - Anfänger-Themen 7
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
P Zugreifen auf Object[] Java Basics - Anfänger-Themen 4
W Zwei Programme sollen auf eine Klasse zugreifen Java Basics - Anfänger-Themen 18
X Methode kann auf ArrayListe nicht zugreifen! Java Basics - Anfänger-Themen 10
F Auf Array einer anderen Klasse zugreifen Java Basics - Anfänger-Themen 4
R Auf eine Stelle [i] des Arrays zugreifen Java Basics - Anfänger-Themen 7
L Wie kann man fehlerfrei im Java Code auf die fxml Datei zugreifen? Java Basics - Anfänger-Themen 26
CptK Auf ActionListener von anderer Klass aus zugreifen Java Basics - Anfänger-Themen 5
K Vererbung Auf Methoden von Unterklassen zugreifen Java Basics - Anfänger-Themen 6
G Klassen Mit fremder Klasse auf public Methode zugreifen Java Basics - Anfänger-Themen 23
J Hinzufügen eines Objekts in eine Liste, um später dann nochmal auf das Objekt zugreifen zu können Java Basics - Anfänger-Themen 8
C Auf einzelne Werte aus HashSet zugreifen Java Basics - Anfänger-Themen 10
D Auf ArrayList mit get zugreifen Java Basics - Anfänger-Themen 8
A Variablen Main Klasse soll auf eine andere Klasse zugreifen Java Basics - Anfänger-Themen 3
C Methoden Auf Methoden anderer Klassen zugreifen Java Basics - Anfänger-Themen 10
P Auf JLabel zugreifen Java Basics - Anfänger-Themen 12
S Auf Array einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 13
das_leon Auf Ordner zugreifen (Vollzugriff) Java Basics - Anfänger-Themen 2
C return kann nicht auf variable zugreifen Java Basics - Anfänger-Themen 26
F Aus einer anderen Klasse auf ein JTextField zugreifen Java Basics - Anfänger-Themen 17
T Methoden Auf Variabler aus anderer Methode zugreifen Java Basics - Anfänger-Themen 5
K Erste Schritte JavaFX - wie von "externer" Klasse auf Methoden des Controllers zugreifen Java Basics - Anfänger-Themen 2
L Auf Methoden einer Subklasse zugreifen ohne Typecast ? Java Basics - Anfänger-Themen 6
DaCrazyJavaExpert Klassen Von einer Klasse auf eine erbende Klasse zugreifen Java Basics - Anfänger-Themen 13
R Auf Variablen einer anderen Klasse zugreifen? Java Basics - Anfänger-Themen 1
F [OOP] Auf eine Variable aus meherer Klassen zugreifen Java Basics - Anfänger-Themen 22
C OOP Von mehreren Klassen aus auf das selbe Objekt zugreifen Java Basics - Anfänger-Themen 8
J Best Practice Auf DefaultTableModel in andere Klasse zugreifen Java Basics - Anfänger-Themen 4
T Auf Instanz einer Liste zugreifen Java Basics - Anfänger-Themen 2
A Variablen In anderer Klasse auf Objekte von JFrame zugreifen Java Basics - Anfänger-Themen 1
S Methoden Auf Methode der Unterklasse zugreifen? Java Basics - Anfänger-Themen 2
K OOP Mit anderer Klasse auf JTextField zugreifen Java Basics - Anfänger-Themen 5
D Von einem Objekt auf Properties zugreifen Java Basics - Anfänger-Themen 3
H Klassen auf eigene Klasse zugreifen Java Basics - Anfänger-Themen 2
H Methoden Auf Methode zugreifen Java Basics - Anfänger-Themen 14
E Methoden Auf Methoden einer Klasse zugreifen, ohne ein Objekt zu erstellen Java Basics - Anfänger-Themen 2
N Auf TextFeld aus anderer Klasse zugreifen ohne es zu übergeben Java Basics - Anfänger-Themen 3
W aus Methode auf JLabel zugreifen und Image verändern Java Basics - Anfänger-Themen 1
P auf superklasse zugreifen Java Basics - Anfänger-Themen 24
P auf eine andere Klasse zugreifen Java Basics - Anfänger-Themen 12
P aus ActionListener auf HauptFrame zugreifen Java Basics - Anfänger-Themen 4
C Wie kann ich jetzt von der Game.java auf die Timer.java zugreifen? Java Basics - Anfänger-Themen 6
D Methoden Wie können Klassen auf Klassenfremde Objekte zugreifen? Java Basics - Anfänger-Themen 7
H Klassen Auf eine Hashtable aus mehreren Klassen zugreifen Java Basics - Anfänger-Themen 12
D Auf equals von Vaterklasse zugreifen Java Basics - Anfänger-Themen 4
S Methode auf Main zugreifen Java Basics - Anfänger-Themen 5
C Aus mehrern Methoden auf selbes Array zugreifen Java Basics - Anfänger-Themen 4
K Nachträglich auf Objekte zugreifen Java Basics - Anfänger-Themen 2
B Klassen Auf Instanz anderer Klasse zugreifen Java Basics - Anfänger-Themen 1
S auf Array zugreifen Java Basics - Anfänger-Themen 2
D Best Practice Mit Java auf fremdartige Formate zugreifen. Java Basics - Anfänger-Themen 3
D Bei Objekt der Oberklasse auf Unterklassenmethode zugreifen? Java Basics - Anfänger-Themen 4
S Klassen Auf Objekt in Klasse A in Klasse B zugreifen Java Basics - Anfänger-Themen 4
C Klasse auf mehrere Objekte zugreifen lassen Java Basics - Anfänger-Themen 26
I Auf Methode zugreifen ( Objekt.Methode; ) Java Basics - Anfänger-Themen 1
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
G Auf Objekt der selben Klasse zugreifen Java Basics - Anfänger-Themen 2
D in Mainmethode auf Werte aus Klassenmethode zugreifen Java Basics - Anfänger-Themen 9
J In main erzeugtes objekt zugreifen. Java Basics - Anfänger-Themen 12
V wie kann ich in zweidimensionaller Arraylist auf die einzelnen Elemente zugreifen ? Java Basics - Anfänger-Themen 7
W Klassen Auf andere Klassenobjekte zugreifen Java Basics - Anfänger-Themen 20
A Ohne Cast auf Methode zugreifen? Java Basics - Anfänger-Themen 4
Ananaskirsche Methoden Auf Methode in anderem Package zugreifen Java Basics - Anfänger-Themen 3
T Warum kann ich auf Variable nicht zugreifen Java Basics - Anfänger-Themen 6
E Von Instanz des Dialogs auf das Frame zugreifen Java Basics - Anfänger-Themen 8
A Wieso kann ich nicht auf diese Variable zugreifen? Java Basics - Anfänger-Themen 6
M Auf die Variable einer anderen Klasse zugreifen Java Basics - Anfänger-Themen 9
P Erste Schritte WindowBuilder erstellt Konstruktor wie zugreifen Java Basics - Anfänger-Themen 5
E Methoden auf von Methoden erstellte Objekte zugreifen (verkettete Liste) Java Basics - Anfänger-Themen 10
T Auf jedes Zeichen eines Strings zugreifen? Java Basics - Anfänger-Themen 2
B Auf die x. Stelle eines Array zugreifen Java Basics - Anfänger-Themen 2
A Vererbung Wie auf Variablen der Superklasse zugreifen? Java Basics - Anfänger-Themen 10
I Auf Objekte zugreifen Java Basics - Anfänger-Themen 4
B Bilder laden und drauf zugreifen[Eclipse] Java Basics - Anfänger-Themen 9
D Sortieren von int Werten von Objekten in einer LinkedList, kann nicht auf int Werte zugreifen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben