Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


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, ist
  if (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.


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.