Java ist auch eine Insel

Dienstag, Juli 31, 2007

revalidate(), invalidate(), validate(), repaint() -- Inselupdate

Jede Swing-Komponente liegt zwangsläufig in einem Container. Die Ausmaße der meisten Container sind von der Größe der Kinder abhängig, sodass sie mitbekommen müssen, wenn sich die Größe der Kinder verändert. Wenn etwa ein JLabel einen Text mit einer anderen Länge bekommt, so muss auch der Container sich neu darstellen und seine Kinder neu ausrichten. Diese Mitteilung sendet eine Komponente über die Methode revalidate().

Aus javax.swing.JLabel
public void setText( String text ) {
...
revalidate();
repaint();
...
}
Das revalidate() ist eine geerbte Funktion aus JComponent. Sie ruft im AWT-Event-Thread invalidate() auf und setzt die aktuelle Komponente auf einer Liste der invaliden Komponenten, die beim nächsten Zeichen aktualisiert werden müssen.
Aus javax.swing.JComponent
public void revalidate() {
...
invalidate();
RepaintManager.currentManager( this ).addInvalidComponent( this );
...
}
Das invalidate() ist eine aus Container geerbte Funktion, die allen übergeordneten Swing-Container nach oben und allen Kindern unten mitteilt, dass das Layout nicht mehr aktuell ist. Die Aufforderung zur Neudarstellung übernimmt addInvalidComponent(). Die Methode legt ein Event in die Event-Queue, in der alle invaliden Komponenten vermerkt sind. Beim Neuzeichnen ruft der Event-Thread auf allen diesen Komponenten die Berechnungsfunktion validate() auf, damit das Layout wieder stimmt. Der Container überschreibt validate() und ruft die protected-Methode validateTree() auf, was die Komponenten des Containers zur Neuberechnung auffordert. Halten wir noch drei Aussagen fest:

• Eine Neuzeichnung ist mit invalidate() nicht verbunden. Die Funktion
markiert nur Komponenten.

• Eine Neuberechnung ist mit invalidate() nicht verbunden, denn invalidate()
ruft nicht validate() auf.

• Das validate() führt ebenfalls nicht zur Neudarstellung, sondern nur zur
Neuberechung der Größen.

Mit diesem Vorgehen führt das revalidate() nach einem Markieren der Komponenten im Baum über invalidate() zu einem Repaint-Event, was über validate() die Größen neu berechnet und zur korrekten Neudarstellung führt. Die Funktion validate() können wir auch selbst zur Neuberechung des Layouts aufrufen – doch dürfen wir nicht vergessen, ein repaint() aufzurufen.

Labels:

AddThis Social Bookmark Button