Wie können Abläufe zeitlich gesteuert werden? (Timer)

Aus Informatik
Wechseln zu: Navigation, Suche

Mit Hilfe der Klasse Timer können in Java Abläufe zeitlich gesteuert werden. Insgesamt gibt es drei Timer in Java: java.util.Timer, javax.management.timer.Timer und javax.swing.Timer. Der Management-Timer ist eine TimerMBean und als Managed Bean mit einer ganz besonderen Schnittstelle für Außenstehende zugänglich, er kann - wie der Util-Timer - Tasks ausführen. Der Swing-Timer führt hingegen keine Task-Objekte aus, sondern ActionListener.

Wir werden uns an dieser Stelle lediglich mit dem Swing-Timer auseinandersetzen, da er für uns am leichtesten zu handhaben ist und in seinem Umfang genügt.

Implementierung eines Timers

Ein Timer-Objekt kann - im Gegensatz zu vielen anderen Objekten - nicht automatisch eingebunden werden. Die Implementierung muss daher "zu Fuß" erfolgen.

Zuerst muss die zuständige Klasse importiert, ein Timer vereinbart und initialisiert werden

 import javax.swing.*;
 
 ...
 
   // Anfang Attribute
   private Timer timer;
 
   ...
   
   // Anfang Komponenten
   timer = new Timer(1000, new ActionListener() {
              public void actionPerformed(ActionEvent evt) {
                timer_ActionPerformed(evt);
           }
       });
   timer.setInitialDelay(2000);

timer.setInitialDelay(0); legt fest, dass beim Start des Timers 2s gewartet wird, bis zum ersten Mal ein Timer-Event ausgelöst wird. In new Timer(1000, ...) wird das Zeitintervall (in Millisekunden) vereinbart, in welchem jeweils weitere Timer-Events ausgelöst werden. Zudem wird auf eine Methode timer_ActionPerformed(evt); verwiesen, die bei jedem ausgelösten Timer-Event aufgerufen wird. In dieser Methode sollten dann alle Dinge stehen, die nach einer bestimmten Zeitspanne ausgeführt werden sollen.

  public void timer_ActionPerformed(ActionEvent evt) {
    tu_dies_und_jenes();
  }

Starten und Beenden des Timers

Ist ein Timer einmal implementiert, kann er beliebig oft ein- bzw. ausgeschaltet werden, z. B. mit Hilfe eines Buttons. Allerdings ist zu Beachten, dass ein Timer, der schon aktiv ist nicht noch einmal mit timer.start(); aktiviert werden kann, es kommt zu einer Fehlermeldung. Ähnlich verhält es sich mit einem deaktivierten Timer und timer.stop();.

Eine Lösung bietet z. B. der folgende Code:

  public void btnTimer_ActionPerformed(ActionEvent evt) {
    if (timer.isRunning()) {
      timer.stop();
    }
    else {
      timer.start();
    }
  }