12.3.1 | Laufschrift |
Die Laufschrift, die in diesem Abschnitt beschrieben wird, bewegt sich von rechts nach links, vertikal zentriert, über den Bildschirm. Hier zuerst einmal das zugehörige Listing, im Anschluss erklären wir die Vorgehensweise:public class ScrollTextDemo1 extends Applet implements Runnable { final int STEP = 5; // Schrittweite // Text der Laufschrift final String TEXT = "a little graphic demo in Java"; final int DELAY = 100; // Verzögerung in Millisekunden int x, y; // aktuelle Position der Schrift int textwidth; // Schriftbreite Thread t; // Thread zur Steuerung der Laufschrift public void init() { // Setzen des Fonts setFont(new Font("SansSerif", Font.PLAIN, 30)); FontMetrics fm = getFontMetrics(getFont()); // Initialisierung der Startposition der Schrift y = (int)(getSize().height - fm.getHeight()) / 2 + fm.getAscent(); x = getSize().width; // Schriftbreite ermitteln textwidth = fm.stringWidth(TEXT); setBackground(Color.white); } public void paint(Graphics g) { g.drawString(TEXT, x, y); // Zeichnen der Schrift } public void start() { if (t == null) { // Wenn kein Thread angelegt ist t = new Thread(this); // Anlegen und Starten des Threads t.start(); } } public void stop() { t = null; // dereferenzieren } public void run() { Thread me = Thread.currentThread(); while(me == t) { if (x < -textwidth) // Text am Ende des Applets? x = getSize().width; // wieder zum Anfang else // sonst x = x - STEP; // um 'STEP' versetzen repaint(); // Text neu zeichnen try { t.sleep(DELAY); // Verzögerung } catch (InterruptedException e) { e.printStackTrace(); } } } }In init() wird die Hintergrundfarbe auf Weiß gesetzt und der Font eingestellt. Der Text wird genauso wie im vorigen Abschnitt horizontal bzw. vertikal zentriert:y = (int)(getSize().height - fm.getHeight()) / 2 + fm.getAscent();x und y repräsentieren die aktuelle Postition des Texts innerhalb des Applets. y bleibt konstant, und x verändert sich ständig, um den Text horizontal zu scrollen. Initialisiert wird x mit der Breite des Applets, da der Text von rechts nach links laufen und anfangs nicht sichtbar sein soll.
Das Applet implementiert das Interface Runnable, da der scrollende Text in einem Thread ausgeführt wird. Weil die Laufschrift während der gesamten Ausführung des Applets aktiv sein soll, enthält die run()-Methode eine Endlosschleife. In dieser wird jeweils die Position des Texts um STEP verschoben. Wenn sich der Text außerhalb des sichtbaren Bereichs des Applets befindet, istif (x < -textwidth) // Text am Ende des Applets?true, und der Text wird wieder an das rechte Ende des Applets gesetzt. Der nächste Durchlauf kann beginnen.
Durch den Aufruf von repaint() wird das Applet aufgefordert, sich neu zu zeichnen. Dies bewirkt letztendlich einen Aufruf von paint(), und der Text wird an der neuen Position gezeichnet.
Wie man bei Betrachtung des Ergebnisses sehen kann, ist die Laufschrift noch nicht perfekt. Sie wird von lästigem Flackern begleitet. Dies liegt an der Implementierung von repaint(). repaint() ruft nämlich nicht direkt paint() auf, sondern update(). In update() wird die Zeichenfläche mit der Hintergrundfarbe übermalt und anschließend erst paint() aufgerufen.
Wie man dieses Flackern umgehen kann und wie diese Zeichenmethoden genau miteinander in Beziehung stehen, wird im Abschnitt 12.4 erklärt.
Obiges Applet kann universeller gestaltet werden, indem man dem Applet zusätzlich den zu scrollenden Text sowie die Vorder- und Hintergrundfarbe als Parameter übergibt.