JFrame时间输出、计时器
利用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时间输出、计时器相关推荐
- 利用OBS输出计时器定时录制功能录制视频
1.在OBS启动界面,按下那个白色的喇叭,关闭麦克风声音,这样启动了电脑内录功能 (不录电脑周围声音,电脑风扇声音也不会被录进去,适合翻录) 2.在cmd中开启电脑自动关机功能-可以省略 (在晚上睡觉 ...
- 12小时进制的时间输出的编辑代码
关于时间输出的编辑代码个人思考了很久,包括顺序,进位之类的,求完善和纠错 public class yunsuanfu {public static void main(String[] arg){d ...
- 【咸鱼教程】基于系统时间的计时器DateTimer(不受FPS影响)
教程目录 一 计时器简介 二 计时器实现 三 Demo下载 一 计时器简介 在手机上跑游戏时,可能由于运动物体过多,导致帧频太低,计时不准确. 比如一些倒计时的游戏,可能倒计时30s,变成了35s. ...
- python datetime strftime_datetime.strftime时间输出转换
datetime.strftime时间输出转换: 注: 1.%Y-%m-%d %H:%M:%S 年-月-日 时:分:秒 2.%A 星期的表示方式,%B 月的英文全写 3.%w周里的第几天,%d月里的第 ...
- 时间倒数计时器_如何建立倒数计时器
时间倒数计时器 Building a simple countdown timer is easy with JavaScript's native timing events. You can re ...
- java中时间输出的格式_Java 打印日期/时间格式
Java格式 - Java 打印日期/时间格式 Java 打印日期/时间格式处理日期,时间和日期时间值. Java 打印日期/时间格式可以应用于格式值为long,Long,java.util.Cale ...
- freecplus框架-日期、时间和计时器
文章目录 一.源代码说明 二.计算机时间的表示方法 三.获取操作系统的时间 四.时间转换函数 1.把整数表示的时间转换为字符串表示的时间 2.把字符串表示的时间转换为整数表示的时间 五.时间的运算 六 ...
- c纳秒级计时器_使用C+提供以纳米秒为单位的时间的计时器功能
这个新的答案使用C+11的.设施.虽然还有其他的答案可以说明如何使用,它们都没有显示如何使用带着RDTSC其他几个答案中提到的设施.所以我想我应该展示如何使用RDTSC带着..此外,我将演示如何在时钟 ...
- mybatis DATE_FORMAT 格式化时间输出
参考:http://www.cnblogs.com/yangy608/p/3950095.html 一.在oracle中,当想把字符串为'2011-09-20 08:30:45'的格式转化为日期格式, ...
最新文章
- TCP/IP 协议栈及 OSI 参考模型详解--云平台技术栈04
- SQL DMV功能使用
- Order By 排序条件中带参数的写法(Oracle数据库、MyBatis)
- 采用java信号量(semaphore)让线程轮流打印
- 计算机应用基础课程编制标准,计算机应用基础课程标准.doc
- selenium-python:运行后报浏览器不兼容 disconnected: unable to connect to renderer
- 什么是动态链接库(DLL)以及常见问题
- moveit环境引入代码
- 我的J2EE成功之路:实战Ajax,JSP,Struts 2, Spring,Hibernate
- 页面性能优化的利器 — Timeline
- pandas提取某两列的值_Pandas进阶修炼120题第五期
- python定时任务apschedule_Python定时任务-APScheduler
- 【论文笔记】FlowNet:有监督的光流估计(optical flow estimation)网络
- 23----2013.07.01---Div和Span区别,Css常用属性,选择器,使用css的方式,脱离文档流,div+css布局,盒子模型,框架,js基本介绍...
- Lintcode:报数
- 【课程设计】Java Web 学生成绩管理系统
- 显示农历天气时钟小部件下载_文字云时钟安卓版下载|文字云时钟app下载_v1.0
- 利用Filezilla在局域网内搭建自己的FTP服务器
- 储罐液位计算机控制系统,罐区管理系统
- C++最长公共子序列问题(LCS)(递归+迭代)