【Java】Java計時器(秒錶)

做你的貓發表於2018-06-29

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

 

相關文章