Neuzeichnen von Swing-Komponenten erzwingen
Hallo.
Erst wenn ich das Gesamtfenster mit der Maus leicht
in der Größe ändere kann ich das tun.
dann muss das Layout erst noch angestoßen werden.
Das sollte mit doLayout() funktionieren. Ist in Swing immer
etwas undurchsichtig, wann eine Oberfläche aktualisiert wird.
Notfalls mit setSize(getSize());
revalidate();
repaint();
aufrufen, um das Neuzeichnen einer Komponente zu erzwingen.
Das sollte immer funktionieren, allerdings eventuell
etwas zeitverzögert, da beide Aufrufe letzlich
eine Warteschlange mit Zeichenaufforderungen
füttern.
Schaut man sich den AWT/Swing-Quellcode etwas genauer
an, werden im groben die folgenden Methoden angestossen:
1 **comp.revalidate()**
1.1 **comp.invalidate()** auf jeder Komponente der Container-Hierarchie
1.1.1 Markiere die aktuelle Komponente als ungültig
1.1.2 Ist die aktuelle Komponente ein Container,
markiere das Layout dieses Containers als
ungültig, falls dieser einen LayoutManager
besitzt: **layoutManager.invalidateLayout(comp)**
1.2 **repaintManager.addInvalidComponent(comp)**
1.2.1 Der RepaintManager übergibt dem
GUI-Ereignisverarbeitungs-Thread (=EDT) einen
**ComponentWorkRequest** zur späteren Ausführung
1.2.2 Sobald dieser Request an der Reihe ist,
wird **comp.validate()** und für leichtgewichtige
(=Swing)-Komponenten zusätzlich ein
**comp.paintImmediatly(...)** ausgeführt
2 **comp.repaint()**
2.1 Für jede sichtbare schwergewichtige (=AWT-)Komponente
der aktuellen Komponentenhierarchie (also in einer
Swing-Applikation normalerweise die Wurzelkomponente
wie Frame oder Applet) übergebe dem EDT ein
AWT-Update-Ereignis.
2.2 Sobald das Update-Ereignis an der Reihe ist, wird ein
**comp.update(g)** und dadurch das **comp.paint(g)**
ausgeführt.
Mit diesem Plan gewappnet lassen sich nun auch die anderen
Varianten verstehen, die man so sieht, um eine Komponente
zum Neuzeichnen zu überreden wie resizeAndRepaint(), updateUI()
oder nicht empfohlene Hacks wie invalidate() + validate() und
das obige setSize(getSize()). All diese Varianten stossen
nämlich indirekt mehr oder minder komplett den skizzierten Ablauf an.
Infos dazu unter:
http://java.sun.com/docs/books/tutorial/uiswing/14pa…
http://java.sun.com/products/jfc/tsc/articles/painti…
sowie der AWT- und Swing-Quellcode unter
http://developer.classpath.org/doc/
Gruß,
-Andreas.