https://blog.csdn.net/c_jian/article/details/50506759
應用名稱:Java計時器
用到的知識:Java GUI程式設計
開發環境:win8+eclipse+jdk1.8
功能說明:計時功能,精確到1毫秒,可暫停。
效果圖:
原始碼:
import javax.swing.*; import java.awt.HeadlessException; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.Font; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; /** * 計時器 */ public class Timer extends JFrame { /** * */ private static final long serialVersionUID = 1L; private static final String INITIAL_LABEL_TEXT = "00:00:00 000"; // 計數執行緒 private CountingThread thread = new CountingThread(); // 記錄程式開始時間 private long programStart = System.currentTimeMillis(); // 程式一開始就是暫停的 private long pauseStart = programStart; // 程式暫停的總時間 private long pauseCount = 0; private JLabel label = new JLabel(INITIAL_LABEL_TEXT); private JButton startPauseButton = new JButton("開始"); private JButton resetButton = new JButton("清零"); private ActionListener startPauseButtonListener = new ActionListener() { public void actionPerformed(ActionEvent e) { if (thread.stopped) { pauseCount += (System.currentTimeMillis() - pauseStart); thread.stopped = false; startPauseButton.setText("暫停"); } else { pauseStart = System.currentTimeMillis(); thread.stopped = true; startPauseButton.setText("繼續"); } } }; private ActionListener resetButtonListener = new ActionListener() { public void actionPerformed(ActionEvent e) { pauseStart = programStart; pauseCount = 0; thread.stopped = true; label.setText(INITIAL_LABEL_TEXT); startPauseButton.setText("開始"); } }; public Timer(String title) throws HeadlessException { super(title); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocation(300, 300); setResizable(false); setupBorder(); setupLabel(); setupButtonsPanel(); startPauseButton.addActionListener(startPauseButtonListener); resetButton.addActionListener(resetButtonListener); thread.start(); // 計數執行緒一直就執行著 } // 為窗體皮膚新增邊框 private void setupBorder() { JPanel contentPane = new JPanel(new BorderLayout()); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); this.setContentPane(contentPane); } // 配置按鈕 private void setupButtonsPanel() { JPanel panel = new JPanel(new FlowLayout()); panel.add(startPauseButton); panel.add(resetButton); add(panel, BorderLayout.SOUTH); } // 配置標籤 private void setupLabel() { label.setHorizontalAlignment(SwingConstants.CENTER); label.setFont(new Font(label.getFont().getName(), label.getFont().getStyle(), 40)); this.add(label, BorderLayout.CENTER); } // 程式入口 public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } Timer frame = new Timer("計時器"); frame.pack(); frame.setVisible(true); } private class CountingThread extends Thread { public boolean stopped = true; private CountingThread() { setDaemon(true); } @Override public void run() { while (true) { if (!stopped) { long elapsed = System.currentTimeMillis() - programStart - pauseCount; label.setText(format(elapsed)); } try { sleep(1); // 1毫秒更新一次顯示 } catch (InterruptedException e) { e.printStackTrace(); System.exit(1); } } } // 將毫秒數格式化 private String format(long elapsed) { int hour, minute, second, milli; milli = (int) (elapsed % 1000); elapsed = elapsed / 1000; second = (int) (elapsed % 60); elapsed = elapsed / 60; minute = (int) (elapsed % 60); elapsed = elapsed / 60; hour = (int) (elapsed % 60); return String.format("%02d:%02d:%02d %03d", hour, minute, second, milli); } } }