Link zu www.kneller-gifs.de

GUI - Stoppuhr mit permanenter Zeitanzeige

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();
    }
}