Components erscheinen erst bei Änderung des Frames

  • Themenstarter Themenstarter Gawain
  • Beginndatum Beginndatum
G

Gawain

Gast
Hallo!

Ich beschäftige mich seit neuestem mit Swing und bin nun auf folgendes Problem gestoßen:

Manchmal werden Components im Frame erst angezeigt, wenn ich das Fenster irgendwie verändere (größer, kleiner, etc). Ich bin draufgekommen dass es damit zusammenhängt, wie viele Components ich im Programm erzeuge (diese müssen nichtmal dem Frame hinzugefügt werden!). Klingt komisch, daher mal ein Beispiel:

Ich erzeuge eine simple Fenster-Klasse:

Java:
import javax.swing.*;
import java.awt.*;

public class Fenster extends JFrame {
	public Fenster() {
		setSize(300, 300);
		setLayout(null);
		setDefaultCloseOperation(3);
		setVisible(true);
	}
	
	public void create() {
		JPanel p = new JPanel();
		p.setSize(100, 100);
		p.setBackground(Color.GREEN);
		add(p);
	}
}

Im Konstruktor werden ganz einfache Einstellungen vorgenommen. Die Methode create() erzeugt ein Panel, modizifiert es ein wenig und fügt es dem Fenster hinzu.

Schließlich die main-Methode:

Java:
import javax.swing.*;
import java.math.*;

public class main {
	public static void main(String[] args) {
		Fenster f = new Fenster();
		f.create();	
	}
}

Zuerst Fenster erzeugen und dann mittels f.create() ein Panel einfügen. Soweit so gut, beim Ausführen sieht man das was man sehen will.

Füge ich aber jetzt in main nach der Zeile
Java:
Fenster f = new Fenster();
folgende Schleife ein:
Java:
for (int i=0; i<100; i++) {
          JLabel l = new JLabel();
}

dann passiert es bei manchen Ausführungen des Programms, dass das Label zunächst nicht angezeigt wird. Erst, wenn ich das Fenster verändere (kurz dran 'ziehen'), erscheint das Label. In dem Fall habe ich vor der create() Methode 100 Panels erzeugt. Wären es nur 10 gewesen, würde das Problem nie auftreten. Bei 1000 tritt es fast bei jedem Programmaufruf auf.

Woran liegt das? Arbeitet da im Hintergrund irgendwas zu langsam oder falsch? Ich kann mir nicht vorstellen, dass dieser Effekt so sein soll. (Man beachte, dass die erzeugten Panels mit dem Frame überhaupt nicht in Kontakt kommen.)

Daten:
Windows XP Home
JDK 1.6.0_21

liebe Grüße
 
Danke, jetzt scheint es immer zu klappen. Aber ganz schleierhaft ist mir das nicht, das scheint ja sehr willkürlich abzulaufen (wenn ich das Programm kurz hintereinander aufrufe, dann klappt es beim ersten mal und beim zweiten mal möglicherweise nicht). Falls das in dem Link geklärt wird, dann sry, muss ich mir noch durchlesen.^^

liebe Grüße
 
Es kann auch helfen, als letzte Anweisung in der create()-Methode
Code:
validate();
einzufügen.
 

Zurück
Oben