Wie können Abläufe zeitlich gesteuert werden? (Timer)
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();
}
}