首页 > 编程 > Java > 正文

Java实现的计时器【秒表】功能示例

2019-11-26 09:15:32
字体:
来源:转载
供稿:网友

本文实例讲述了Java实现的计时器【秒表】功能。分享给大家供大家参考,具体如下:

应用名称: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("www.VeVB.COm 计时器");    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);    }  }}

PS:这里再为大家推荐几款时间及日期相关工具供大家参考使用:

Unix时间戳(timestamp)转换工具:
http://tools.VeVB.COm/code/unixtime

在线日期/天数计算器:
http://tools.VeVB.COm/jisuanqi/date_jisuanqi

在线日期计算器/相差天数计算器:
http://tools.VeVB.COm/jisuanqi/datecalc

在线日期天数差计算器:
http://tools.VeVB.COm/jisuanqi/onlinedatejsq

更多关于java相关内容感兴趣的读者可查看本站专题:《java日期与时间操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表