Cześć! Próbuję zrobić prostą grę planszową. Co ona ma tam robić to jest nieistotne, poniżej jest tylko mały wycinek testowy, który ma zobrazować na czym polega mój problem.

Polega to na tym, że w JPanel znajduje się tablica JLabeli, które tworzą kwadratową planszę. Na początku wszystkie Labele są czerwone, po kliknięciu któregokolwiek z nich wszystkie mają zmienić się na zielone. Tak, wiem, że nie ma to żadnego sensu :P ale teraz chodzi mi tylko o to, żeby ten kolor się zmieniał bez szczególnego celu.
Wiem, że można to łatwo zrobić za pomocą setBackground dla każdego Labela, ale właśnie zależy mi na tym, żeby wykonywało się to z poziomu JPanel (np. stworzenie od nowa pól tablicy fields i ponowne wyświetlenie Panelu), ponieważ pewnie będzie do Panelu podłączona jakaś prosta tablica np. zwykłych charów, na której będzie działa się cała gra i na jej podstawie będą tylko tworzone kolejne JLabele. Mam nadzieję, że w miarę zrozumiale wyraziłem o co mi chodzi.

No i za cholerę nie umiem tego zrobić. Ten bezsensownie przesłoniony paintComponent jest wyłącznie wyrazem mojej desperacji, bo oczywiście nie działa. Mam wrażenie, że robię jakiś błąd logiczny albo czegoś nie przemyślałem, ale już nie umiem do tego dojść. Bardzo proszę o pomoc.

public class PanelBoard extends JPanel {

	private static final int size = 6;
	private Field fields[][] = new Field[size][size];
	
	public PanelBoard() {
		setLayout( new FlowLayout( FlowLayout.CENTER, 0, 0) );
		setPreferredSize( new Dimension( Field.getFSize()*size, Field.getFSize()*size ) );
		
		addFields();

	}
	
	public void addFields() {
		for( int i=0; i<size; i++)
			for( int j=0; j<size; j++ ) {
				fields[i][j] = new Field( i, j, this, Color.red );
				add( fields[i][j] );
			}
	}
	
	public void addFields2() {
		for( int i=0; i<size; i++)
			for( int j=0; j<size; j++ ) {
				fields[i][j] = new Field( i, j, this, Color.green );
				add( fields[i][j] );
			}
	}
	
	@Override
	protected void paintComponent( Graphics g ) {
		
		addFields2();
		for( int i=0; i<size; i++)
			for( int j=0; j<size; j++ ) {
				fields[i][j].revalidate();
				fields[i][j].repaint();
			}
		
		revalidate();
		
		super.paintComponent( g );
	}
}
public class Field extends JLabel {
	
	protected int hor, ver;
	protected static int size = 60;
	protected Color borderColor = Color.black;
	
	public Field( int hor, int ver, PanelBoard pb, Color c) {
		this.ver = ver;
		this.hor = hor;
		
		setBackground( c );
		setBorder( BorderFactory.createLineBorder( borderColor) );
		setOpaque( true );
		setPreferredSize( new Dimension( size, size ) );
		
		addMouseListener( new Mouse( pb, this ) );
	}
	
	public static int getFSize() {
		return size;
	}
}
public class Mouse implements MouseListener {

	PanelBoard pb;
	Field f;
	
	public Mouse( PanelBoard pb, Field f ) {
		this.pb = pb;
		this.f = f;
	}

@Override
	public void mouseReleased( MouseEvent arg ) {
		pb.revalidate();
		pb.repaint();
		
	}
}

W MouseListenerze oczywiście jest przesłoniona reszta metod, ale są one puste, więc ich nie wrzucam, żeby nie rozciągać nadmiernie.