Repaint/Revalidate bei Containern

Cel

Grünschnabel
Hi,

Ein kleines Problem macht mich gerade verrückt: Die Codefragmente gehören zu einer TickTacToe GUI:
Java:
class Token extends JPanel {
	
	
	private Color col;
	
	public Token() {
		this.setPreferredSize(new Dimension(100,100));
	}
	
	public void drawOval(Color col) {
		this.col = col;
	}
	
	@Override
	public void paintComponent(Graphics g) {
		
		super.paintComponents(g);
		g.setColor(new Color(250, 250, 250));
		
		g.fillRect(0, 0, 100, 100);
		if(null != col){
			g.setColor(col);
			g.fillOval(2, 2, 96, 96);
		}		
	}		
}

Malt ein Quadrat und füllt es mit einem Bunten Kreis, wenn ich eine Farbe übergebe.

Java:
	public void update(Observable arg0, Object arg1) {
		
		int[][] field = model.getData();

		if(model.isOver()) {
			
			// TODO Dialog platzieren - Neues Spiel anbieten!
		}
		if (null == arg1) {

			// TODO Loeschen fuer ein neues Spiel
			
		} else if (arg1 instanceof Point) {
			
			Point p = (Point) arg1;

			if(field[p.x][p.y] == 1) {						
				c = Color.RED;
			} else if( field[p.x][p.y] == -1) {
				c = Color.YELLOW;
			}
			
			panels[p.x][p.y].drawOval(c);
			panels[p.x][p.y].repaint();
			
		}

Diese Funktion der GUI updatet einfach das entsprechende Quadrat, das vom Spieler angeklickt wird. Simpel und funktioniert :)

Wenn ich das ganze aber statt dem Oval mit Images mache, funktioniert das ganze nicht mehr zuverlässig.

Java:
class ImageToken extends JPanel {
	
	private Image img;
	
	public ImageToken() {
		this.setPreferredSize(new Dimension(100,100));
	}
	
	public void placeImage(Image img) {
		this.img = img;
	}
	
	@Override
	public void paintComponent(Graphics g) {
		
		super.paintComponents(g);
		g.setColor(new Color(250, 250, 250));
		
		g.fillRect(0, 0, 100, 100);
		if(null != img){
			g.drawImage(img, 1, 1, null);
		}
		
	}	
}

Java:
		} else if (arg1 instanceof Point) {
			
			Point p = (Point) arg1;
			Image randImg;

			if(field[p.x][p.y] == 1) {						
				randImg = imgs1[(int) (Math.random()*imgs1.length)] ;
				panels[p.x][p.y].placeImage(randImg);
			
			} else if( field[p.x][p.y] == -1) {
				randImg = imgs2[(int) (Math.random()*imgs2.length)] ;
				panels[p.x][p.y].placeImage(randImg);
			}
	
			panels[p.x][p.y].repaint();
			
			this.validate();
		}

Das funktioniert aber nicht mehr :/ trotz des validate() befehls auf das JFrame (this) selbst aktualisiert sich die neu dazugesetzten Bilder im Fenster immer erst ab dem dritten oder ich das Fenster durch Größenänderung zum Updaten bringe.
Ich dachte bei der Größenveränderung wird die validate() Methode aufgerufen, aber das scheint wohl nicht zu stimmen. Hat jemand eine Idee, wie ich mein Fenster sofort zum aktualisieren bringe?
 
Java:
  if(null != img){
            g.drawImage(img, 1, 1, this);
        }

Okay, wenn ich den ImageObserver von null durch ein this ersetze, dann klappts auf einmal. Jetzt funktionierts zwar, aber ich hab nicht verstanden warum :( Kann mir jemand erklären, was sich jetzt großes getan hat?
 
Zurück