用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

计时器

2017-12-20 作者: zyydfhlw举报

[java]代码库

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


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...