利用JFrame实现时间输出和计时器功能,输出当前时间XXXX年XX月XX日  xx时xx分xx秒。秒表,可以开始计时,暂停,继续计时和清零的功能。功能虽然简单,但挺好玩的。做的时候没有加入大量其他的设计让外观变的好看,感兴趣的还可以往上面加其他功能。

这个大概是半年前弄的小玩意,当时没有接触到博客,最近在整理代码时无意间发现,觉得挺有意思的,拿出来给自己总结一下。

唯一碰到的坑就是这两个东西分开时都能正常,当合并在一起时,线程之间会发生冲突,时间错乱,当时想了很久没有想到,后来真正接触到了守护线程,内部类的时候,定义了守护线程,定义了内部类,将冲突的线程给分离开,最终实现了

效果图如下

先说说思路,两个lable,一个显示当前时间,一个显示开始计时的时间。一共两个按钮,开始和清零,给这两个按钮设置监听器,并且设置一个状态,状态默认是暂停的,在开始按钮的监听事件中判断。当为true时按钮显示为继续,当点击后状态改变为false,按钮显示为暂停。调用对应的线程处理不同的事情。

主要讲那个设置的状态理解透那就不难了,定义一个stopped状态

<strong>//计时器初始状态是暂停的private long pauseStart=progranStart;</strong>

是否开始或者继续计时都是由该状态决定,进入计时器线程后,状态值设置为true。当进入到监听器时,判断状态值,为true则开始计时,每毫秒刷新一次,并将状态改变为false,按钮显示为暂停,当点击暂停时,状态变成true,计时停止,按钮变成继续。这里比较容易混乱建议拿着代码多敲几遍理解一下。

清零按钮的监听器事件设置,就是将lable中的初始值00:00:00 000还原,将状态变成true。

而时间显示线程写成外部类,避免与时间计时线程相冲突。再有线程去调用,每秒刷新一次。

代码里面都有注释

代码如下:

package time;import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;/*** * @author wlw**/
public class time extends JFrame {/*** 序列化*/private static final long serialVersionUID = 4408196785766662795L;// 初始显示private static final String INITIAL_LABEL_TEXT = "00:00:00 000";// 计数线程 内部类private CountingThread thread = new CountingThread();// 计时器开始时间private long progranStart = System.currentTimeMillis();// 计时器初始状态是暂停的private long pauseStart = progranStart;// 计时器暂停时的时间private long pauseCount = 0;static JLabel lable2 = new JLabel(INITIAL_LABEL_TEXT);static JButton startPanuseButton = new JButton("开始");static JButton resetButtone = new JButton("清零");/*** 暂停或者继续的监听器* */private ActionListener startPauseButtonListener = new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if (thread.stopped) {// 暂停的时间=开始的时间-暂停时的总时间+暂停的时间pauseCount += (System.currentTimeMillis() - pauseStart);thread.stopped = false; // 停止计数线程运行startPanuseButton.setText("暂停");// 将开始按钮变成暂停按钮} else {pauseStart = System.currentTimeMillis();thread.stopped = true;startPanuseButton.setText("继续");}}};// 定义一个侦听器,点击清零时触发private ActionListener resetButtonList = new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {pauseStart = progranStart; // 开始计时pauseCount = 0; // 暂停的时间清零thread.stopped = true;// 启动计时线程lable2.setText(INITIAL_LABEL_TEXT);// 00:00:00startPanuseButton.setText("开始");}};/*** 定义个一内部类:计算线程,计算总的时间* * @author soft01**/// 计时器线程class CountingThread extends Thread {/*** 定义一个状态,判断是否是(暂停、继续)计时*/public boolean stopped = true;private CountingThread() {/*** 定义守护线程(主线程结束时,守护线程死亡)*/setDaemon(true);}@Overridepublic void run() {while (true) {if (!stopped) {// 减去开始的时间减去暂停的时间long elapsed = System.currentTimeMillis() - progranStart - pauseCount;lable2.setText(Format(elapsed));}try {sleep(1);// 每一毫秒就刷新一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();// System.exit(0);正常退出,程序正常执行结束退出// 如果非正常退出,就是说无论程序正在执行与否,都退出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);// %02d:%02d:%02d:%03d 00:00:00:000return String.format("%02d:%02d:%02d:%03d", hour, minute, second, milli);}}// 构造方法public time(String title) {super(title);// 对开始、暂停按钮进行侦听startPanuseButton.addActionListener(startPauseButtonListener);// 对清零按钮进行侦听resetButtone.addActionListener(resetButtonList);// 启动计数线程thread.start();}public static void main(String[] args) throws InterruptedException {time frame = new time("时间");JPanel panel = new JPanel();Font font = new Font("宋体", Font.BOLD, 30);/*** 调用时间类,输出当前时间*/Timerto timer = new Timerto();/*** 系统时间线程*/Thread th = new Thread(timer);th.start();JLabel lable = new JLabel();// try {// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());// } catch (Exception e) {// // TODO: handle exception// }panel.setLayout(null);// 打破面板的默认布局,只有这样标签才能移动panel.setBackground(Color.red);lable.setBackground(Color.yellow);lable.setFont(font);lable.setOpaque(true);// 打破标签的默认布局lable.setBounds(200, 60, 330, 60); // 设置标签的位置lable2.setBackground(Color.yellow);lable2.setFont(font);lable2.setOpaque(true);// 打破标签的默认布局lable2.setBounds(200, 180, 330, 60);startPanuseButton.setBounds(200, 280, 90, 60);resetButtone.setBounds(400, 280, 90, 60);panel.add(startPanuseButton);panel.add(resetButtone);panel.add(lable); // 把标签贴到面板上panel.add(lable2);frame.add(panel); // 将面板插入到窗口中去frame.setSize(800, 400); // 设置窗口的宽高frame.setLocationRelativeTo(null);// 设置窗口默认中间frame.setAlwaysOnTop(true);// 设置窗口永远显示在最前端frame.setResizable(false);// 设置窗口不能被修改frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);// frame.pack();/*** 不断刷新当前时间*/while (true) {lable.setText(timer.getCurrentTime());}}}/*** 定义一个Timerto类,继承Runnable 输出现在的时间* * @author wlw**/
class Timerto implements Runnable {private String currentTime;// 获取当前时间public String getCurrentTime() {Date d = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");currentTime = sdf.format(d);return currentTime;}/*** 每秒刷新一次*/public void run() {try {Thread.sleep(1000);getCurrentTime();} catch (InterruptedException e) {e.printStackTrace();}}
}

JFrame时间输出、计时器相关推荐

  1. 利用OBS输出计时器定时录制功能录制视频

    1.在OBS启动界面,按下那个白色的喇叭,关闭麦克风声音,这样启动了电脑内录功能 (不录电脑周围声音,电脑风扇声音也不会被录进去,适合翻录) 2.在cmd中开启电脑自动关机功能-可以省略 (在晚上睡觉 ...

  2. 12小时进制的时间输出的编辑代码

    关于时间输出的编辑代码个人思考了很久,包括顺序,进位之类的,求完善和纠错 public class yunsuanfu {public static void main(String[] arg){d ...

  3. 【咸鱼教程】基于系统时间的计时器DateTimer(不受FPS影响)

    教程目录 一 计时器简介 二 计时器实现 三 Demo下载 一 计时器简介 在手机上跑游戏时,可能由于运动物体过多,导致帧频太低,计时不准确. 比如一些倒计时的游戏,可能倒计时30s,变成了35s. ...

  4. python datetime strftime_datetime.strftime时间输出转换

    datetime.strftime时间输出转换: 注: 1.%Y-%m-%d %H:%M:%S 年-月-日 时:分:秒 2.%A 星期的表示方式,%B 月的英文全写 3.%w周里的第几天,%d月里的第 ...

  5. 时间倒数计时器_如何建立倒数计时器

    时间倒数计时器 Building a simple countdown timer is easy with JavaScript's native timing events. You can re ...

  6. java中时间输出的格式_Java 打印日期/时间格式

    Java格式 - Java 打印日期/时间格式 Java 打印日期/时间格式处理日期,时间和日期时间值. Java 打印日期/时间格式可以应用于格式值为long,Long,java.util.Cale ...

  7. freecplus框架-日期、时间和计时器

    文章目录 一.源代码说明 二.计算机时间的表示方法 三.获取操作系统的时间 四.时间转换函数 1.把整数表示的时间转换为字符串表示的时间 2.把字符串表示的时间转换为整数表示的时间 五.时间的运算 六 ...

  8. c纳秒级计时器_使用C+提供以纳米秒为单位的时间的计时器功能

    这个新的答案使用C+11的.设施.虽然还有其他的答案可以说明如何使用,它们都没有显示如何使用带着RDTSC其他几个答案中提到的设施.所以我想我应该展示如何使用RDTSC带着..此外,我将演示如何在时钟 ...

  9. mybatis DATE_FORMAT 格式化时间输出

    参考:http://www.cnblogs.com/yangy608/p/3950095.html 一.在oracle中,当想把字符串为'2011-09-20 08:30:45'的格式转化为日期格式, ...

最新文章

  1. TCP/IP 协议栈及 OSI 参考模型详解--云平台技术栈04
  2. SQL DMV功能使用
  3. Order By 排序条件中带参数的写法(Oracle数据库、MyBatis)
  4. 采用java信号量(semaphore)让线程轮流打印
  5. 计算机应用基础课程编制标准,计算机应用基础课程标准.doc
  6. selenium-python:运行后报浏览器不兼容 disconnected: unable to connect to renderer
  7. 什么是动态链接库(DLL)以及常见问题
  8. moveit环境引入代码
  9. 我的J2EE成功之路:实战Ajax,JSP,Struts 2, Spring,Hibernate
  10. 页面性能优化的利器 — Timeline
  11. pandas提取某两列的值_Pandas进阶修炼120题第五期
  12. python定时任务apschedule_Python定时任务-APScheduler
  13. 【论文笔记】FlowNet:有监督的光流估计(optical flow estimation)网络
  14. 23----2013.07.01---Div和Span区别,Css常用属性,选择器,使用css的方式,脱离文档流,div+css布局,盒子模型,框架,js基本介绍...
  15. Lintcode:报数
  16. 【课程设计】Java Web 学生成绩管理系统
  17. 显示农历天气时钟小部件下载_文字云时钟安卓版下载|文字云时钟app下载_v1.0
  18. 利用Filezilla在局域网内搭建自己的FTP服务器
  19. 储罐液位计算机控制系统,罐区管理系统
  20. C++最长公共子序列问题(LCS)(递归+迭代)

热门文章

  1. 手把手教你安装虚拟机(官网下载VMware)
  2. 【CAD】创建多行文本
  3. css做喇叭动画,使用CSS3模拟音箱(音响)声音扩展动画效果
  4. 详解数据存储芯片AT24C02的应用及编程
  5. 【Root】Android Root 刷机,搞机指南
  6. 基于SpringBoot+LayerUI的校内信息共享平台
  7. 我们的目标是星辰大海
  8. 内推 | 【思迈特-BI工程师】成都 8-10K
  9. Spring航空母舰
  10. 硬盘电路板损坏怎么恢复数据/电路板损坏恢复成功的概率有多大