java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java计时器

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

作者:不能吃的坚果

这篇文章主要介绍了Java实现的计时器【秒表】功能,结合实例形式分析了Java结合JFrame框架的计时器功能相关操作技巧,需要的朋友可以参考下

本文实例讲述了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.jb51.net 计时器");
    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.jb51.net/code/unixtime

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

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

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

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

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

您可能感兴趣的文章:
阅读全文