Zur ständigen Aktualisierung der Zeitanzeige wird ein Thread benötigt. Dieser wird durch Implementierung des Runnable- Interfaces mit der Methode run() realisiert. Es wird also ein neues Thread-Objekt erzeugt, und die start-Methode des neuen Thread-Objekts aufgerufen. Dadurch wird die run-Methode des übergebenen Objekts gestartet, in der der Thread in einem festen Zeitzyklus (10 Millisekunden) die Zeit neu berechnet und anzeigt. Für die Präsentationsberechnungen in min:sek:ms wird die Klasse Calendar genutzt.
Hier der Quellcode zum oben beschiebenen Programm:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Stoppuhr extends JFrame implements Runnable {
private JLabel labelAnzeige;
private JButton startButton, stopButton;
private long millisekundenStart, millisekundenBisher;
private boolean uhrAktiv = false;
private Calendar dauer;
private int min, sek, ms;
public Stoppuhr() {
setTitle("Stoppuhr");
getContentPane().setBackground(Color.ORANGE);
setLayout(new BorderLayout(9, 9));
labelAnzeige = new JLabel("Start anklicken...");
labelAnzeige.setHorizontalAlignment(JLabel.CENTER);
startButton = new JButton("Start");
stopButton = new JButton("Stop");
getContentPane().add("North", labelAnzeige);
getContentPane().add("West", startButton);
getContentPane().add("East", stopButton);
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
start();
}
});
stopButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stop();
}
});
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
private void start() {
if (!uhrAktiv) {
uhrAktiv = true;
Thread th = new Thread(this); // Thread anlegen
millisekundenStart = System.currentTimeMillis();
th.start(); // Thread starten
}
}
private void stop() {
uhrAktiv = false;
}
public void run() {
StringBuffer ausgabe;
while (uhrAktiv) {
labelAnzeige.setForeground(Color.BLACK);
ausgabe=new StringBuffer();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
millisekundenBisher = System.currentTimeMillis()
- millisekundenStart;
dauer = Calendar.getInstance();
dauer.setTimeInMillis(millisekundenBisher);
min=dauer.get(Calendar.MINUTE);
sek=dauer.get(Calendar.SECOND);
ms=dauer.get(Calendar.MILLISECOND);
if (min <= 9) {
ausgabe.append("0"+min+":");
} else {
ausgabe.append(min+":");
}
if (sek <= 9) {
ausgabe.append("0"+sek+":");
} else {
ausgabe.append(sek+":");
}
if (ms <= 9) {
ausgabe.append("00"+ms);
} else if (ms <= 99) {
ausgabe.append("0"+ms);
} else {
ausgabe.append(ms);
}
labelAnzeige.setText(ausgabe.toString());
}
labelAnzeige.setForeground(Color.RED);
}
}
Testklasse zum Starten der Anwendung
public class Test {
public static void main(String[] args) {
Stoppuhr su=new Stoppuhr();
}
}
|