Die Methode
run() des Threads führt eine
Endlosschleife aus, in der die boolsche Variable
running abgefragt
wird. Ist sie
true wird das Feld
index incrementiert. Es kann
Werte zwischen 1 und 60 annehmen und steuert den Winkel des Sekundenzeigers.
Dies wird erreicht, indem mittels
repaint() die Methode
paintComponent()
wiederholt aufgerufen wird. Sie dient dazu, das Panel neu zu zeichnen und so
u.a. auch
index jedes Mal neu auszuwerten.
Thread.sleep()
bewirkt die Unterbrechung der Threadausführung innerhalb der kontinuierlich
ablaufenden
while-Schleife für 1000 Millisekunden. Jede Sekunde
wird somit
index hochgezählt und die Komponente mit diesem Wert
neu gezeichnet.
Schauen wir uns
paintComponent(Graphics g) etwas genauer an. Das
übergebene
Graphics-Objekt wird als erstes in ein
Graphics2D-Objekt
gecastet. Auf diesem werden die nachfolgenden Operationen ausgeführt.
Nach dem Überzeichnen mit einer weißen Grundfläche wird als
erstes die Orientierung der Y-Achse des der Zeichnung zugrunde liegenden
Koordinatensystems umgekehrt. Im Normalfalle verläuft sie von oben nach
unten, sodass in der linken oberen Ecke des Zeichnungsfensters der Punkt 0|0
liegt und üblicherweise von oben nach unten gezeichnet wird. Obwohl es
natürlich auch so ginge, soll der 0-Punkt hier in die Mitte der
Zeichenfläche gelegt und von unten nach oben gezeichnet werden. Um das zu
erreichen wird eine affine Transformation durchgeführt, die durch die
gleichnamige Klasse realisiert werden kann. Ihre Methode
setToScale()
führt hier eine Skalierung mit dem Faktor 1 (also keine) durch, deren
Y-Wert jedoch negativiert wird. Ein weiteres
AffineTransform-Objekt mit
einer Verschiebung des Initialisierungspunktes in die Mitte des Panels wird
erzeugt und mit dem ersten verknüpft. Das
Graphics2D-Objekt wird
dann mit diesem Initialisierungspunkt versehen.
Die drei dann folgenden Blöcke sind recht ähnlich.
- Eine Zeichenfarbe wird definiert
- Das zu zeichnende Objekt wird gebildet
- Die jeweils benötigte Rotation wird - ggf. wiederholt in einer
Schleife - dem AffineTransform-Objekt mitgeteilt
- Ein Shape-Objekt wird erzeugt und schließlich gezeichnet
Im letzten Block findet sich das oben erwähnte Feld
index wieder,
das den Wnkel
winkel multipliziert und den Sekundenzeiger um diesen um
den Punkt 0|0 rotieren lässt.