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

 更新时间:2019年02月25日 10:11:33   作者:不能吃的坚果  
这篇文章主要介绍了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程序设计有所帮助。

您可能感兴趣的文章:

相关文章

  • Java单例模式的五种实现方式

    Java单例模式的五种实现方式

    单例模式(Singleton Pattern)是Java中最简单的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,下面这篇文章主要给大家介绍了关于Java单例模式的五种实现方式 ,需要的朋友可以参考下
    2022-06-06
  • Java web自定义filter代码实例

    Java web自定义filter代码实例

    这篇文章主要介绍了Java web自定义filter代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Java编程之多线程死锁与线程间通信简单实现代码

    Java编程之多线程死锁与线程间通信简单实现代码

    这篇文章主要介绍了Java编程之多线程死锁与线程间通信简单实现代码,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • SpringBoot配置 Druid 三种方式(包括纯配置文件配置)

    SpringBoot配置 Druid 三种方式(包括纯配置文件配置)

    本文给大家分享在项目中用纯 YML(application.yml 或者 application.properties)文件、Java 代码配置 Bean 和注解三种方式配置 Alibaba Druid 用于监控或者查看 SQL 状况的相关知识,感兴趣的朋友一起看看吧
    2021-10-10
  • SpringSecurity+Mysql数据库实现用户安全登录认证的实践

    SpringSecurity+Mysql数据库实现用户安全登录认证的实践

    Spring Security 是一个提供身份认证、授权和防范常见攻击的安全权限框架,本文主要介绍了SpringSecurity+Mysql数据库实现用户安全登录认证的实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • Java中Mybatis-Plus使用方式介绍

    Java中Mybatis-Plus使用方式介绍

    Mybatis-Plus提供了多种方式来执行SQL,包括使用注解、XML映射文件和 Lambda表达式等,其中,使用Lambda表达式是Mybatis-Plus推荐的方式,因为它更加直观和类型安全,,需要的朋友可以参考下
    2023-06-06
  • Struts1简介和入门_动力节点Java学院整理

    Struts1简介和入门_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Struts1简介和入门的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 详解springboot shiro jwt实现权限管理

    详解springboot shiro jwt实现权限管理

    为什么使用jwt呢,因为可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快。本篇通过具体代码来进行详情解析,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • Java编写简单猜数游戏

    Java编写简单猜数游戏

    这篇文章主要为大家详细介绍了Java编写简单猜数游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • 详解Java实现负载均衡的几种算法代码

    详解Java实现负载均衡的几种算法代码

    本篇文章主要介绍了详解Java实现负载均衡的几种算法代码 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论