swing.Timerによる簡易ストップウォッチ。

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.Timer;

@SuppressWarnings("serial")
public class MyTimer extends JFrame implements ActionListener {
  public static void main(String[] args) {
    final MyTimer mt = new MyTimer();
    mt.pack();
    mt.setLocationRelativeTo(null);
    mt.setVisible(true);
  }

  final Font _font = new Font("Monospaced", Font.BOLD, 64);
  final JLabel _label = new JLabel("0:00.0");
  final Timer _timer;
  long _startAt;

  public MyTimer() {
    super();
    _timer = new Timer(100, this);

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    final Container cpane = getContentPane();
    cpane.setLayout(new BorderLayout());
    _label.setFont(_font);
    _label.setHorizontalAlignment(SwingConstants.RIGHT);
    cpane.add(_label, BorderLayout.CENTER);
    final JToggleButton btn = new JToggleButton("START");
    btn.addActionListener(new ActionListener() {
      public void actionPerformed(final ActionEvent e) {
        if (btn.isSelected()) {
          btn.setText("STOP");
          start();
        } else {
          btn.setText("START");
          stop();
        }
      }
    });
    cpane.add(btn, BorderLayout.SOUTH);
  }

  void start() {
    _startAt = System.currentTimeMillis();
    _timer.start();
  }
  void stop() {
    _timer.stop();
  }

  private static String zero(final long v, final int n) {
    final String s = String.valueOf(v);
    final StringBuilder rtn = new StringBuilder();

    final int left = n - s.length();
    while (rtn.length() < left) {
      rtn.append('0');
    }
    rtn.append(s);
    return rtn.toString();
  }

  private String hoge(final long l) {
    final long d = (l - _startAt) / 1000;
    final long d2 = ((l - _startAt) / 10) % 10;
    final long min = d / 60;
    final long sec = d % 60;
    final String text = min + ":" + zero(sec, 2);
    final String x = zero(d2, 1);
    return text + "." + x;
  }

  public void actionPerformed(final ActionEvent e) {
    _label.setText(hoge(System.currentTimeMillis()));
  }
}