【Java】Java计时器(秒表)

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

原文地址:https://www.cnblogs.com/yxdmoodoo/p/9244635.html

时间: 2024-08-09 09:23:46

【Java】Java计时器(秒表)的相关文章

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识.算法.效率什么的都没怎么考虑,就纯粹实现功能而已. 先上代码: 1 package com.tacyeh.common; 2 3 public class MyMath { 4 5 public static String BigNumSum(String... n) { 6 int length = n.length; 7 StringBuilder result = new StringBuilder(); 8 //这里判断其实不需

[Java] JAVA面试题

1.String是最基本的数据类型吗?基本数据类型包括byte.int.char.long.float.double.boolean和short.java.lang.String类是final类型的,因此不可以继承这个类.不能修改这个类.为了提高效率节省空间,我们应该用StringBuffer类 2.String 和StringBuffer的区别JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数 值不可

微信表情过滤 java "java.sql.SQLException: Incorrect string value: '\"

iOS 5.0之前,苹果都是采用3个字节来承接emoji表情,Java的普通char可以支持显示.但iOS 5.0之后, 苹果升级了系统自带的emoji表情输入法,用的Unicode 6标准来统一,是采用4个bytes来承接一个 emoji表情.如果不做处理的话,这种表情直接存储到mysql5.5以下的数据库是会报错的. 就像这两个表情一样:, 在Windows 8以下估计都不支持显示,可能会显示成框框,可能压根就是空白, 你可以在Mac中使用Safari浏览器中,就可以看到.经过测试,在Mac

新手如何学习java(java学习建议路线图)

怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业要学到的一些东西:     首先要明白Java体系设计到得三个方面:J2SE,J2EE,J2ME(KJAVA).J2SE,Java 2 Platform Standard Edition,我们经常说到的JDK,就主要指的这个,它是三者的基础,属于桌面级应用开发,这部分如果学得好很容易拓展J2EE和J2ME.J2ME,The Micro Edition of the Java 2 Platform.主要用于嵌入

Java/Android计时器(开始,暂停,恢复,停止)

由于要做暂停和恢复,这里我就没有使用Android的CountDownTimer,而是用了Java的Timer.所以,这个方法在java肯定是通用.我也外加了Android独有的Service,有些计时器需要在Activiy关闭的情况下依然在计时,回到Activity时,显示当前的计时状态. Timer 这个Java的类,具体看Java的API说明,但是要注意一点: Timer 在cancel后,需要重新new 一次. 首先要给计时器定义三个状态:准备,开始,暂停. public static

Java 简单计时器

代码 package com.benywave; import java.util.Timer; import java.util.TimerTask; public class TimerTest { private Timer timer; private long elapsedSeconds; public TimerTest() { timer = new Timer(); } public static void main(String[] args) { //System.out.

简单说一下java中计时器,实际需要,没有详解

因为Android程序有升级推送,并且把推送提示的窗口放在了开平图那个页面,而且开平图页面四秒,然后进入主界面,没有升级没事,但是有的话如果点击取消则窗口消失,不点击的话则一直显示,虽然程序没有bug,但是log输出会报错,而且程序的健壮性肯定不行,然后本来想用线程睡眠的,但是不合适,博主选择的计时器,三秒用户不操作自动消失,开屏展示依旧不受影响,好了,上代码: public class TimerTaskClass { Timer timer; long endTime = System.cu

Android实战第一篇——时钟+闹钟+计时器+秒表

学习了快一学期的Android了,之前的知识点都是零散的学习的,只有当我们真正的去把他们用起来的时候才会发现难点,自己才会独立尝试去解决某个问题.接下来是我的一个简单的多功能时钟的小实战(视频资源http://pan.baidu.com/s/1i5AT4nN 密码:jq7g) 具体的效果可以参考手机上的时钟. 首先我们来看一看布局文件layout_main.xml 我们总的来看一下整个布局 <FrameLayout xmlns:android="http://schemas.android

Java - Java入门(2-1am)

第一讲.Java入门 1. 计算机语言是人和计算机进行交互的一种工具,人们通过使用计算机语言编写程序来向计算机施令,计算机则执行程序,并把结果输出给用户. 2. 机器语言:由0.1序列构成的指令码组成 如:10000000  加        10010000减          11110000 打印 3. 汇编语言:用助记符号描述的指令系统 如: Mov   A, #10; Mov   B, #20; Add   A,  B; 4. 高级语言: 面向过程的高级语言:程序设计的基本单元为函数

[java] java 中Unsafe类学习

java不能直接访问操作系统底层,而是通过本地方法来访问.Unsafe类提供了硬件级别的原子操作,主要提供了以下功能: 1.通过Unsafe类可以分配内存,可以释放内存: 类中提供的3个本地方法allocateMemory.reallocateMemory.freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应. 2.可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的: public native long allocateMemory(long l