目录

1、前端界面的设计

2、添加控件的事件监听

3、通过主线程对时间实时显示

4、启用线程实现对时间的修改

5、线程同步实现秒表功能

6、运行并进行调试


Hello,大家好,我是灰小猿!

今天和大家分享一个使用Java多线程开发的电子表项目,可以实现电子表中时间的实时显示,修改以及秒表的功能。

Java电子表设计的设计顺序为从前端界面到后端类及线程的设计,之后将前后端相结合而成。以下是电子表的开发过程:

1、前端界面的设计

电子表的前端界面设计依据JFrame窗体和Container容器,采用绝对定位的方法对时间显示、时间修改、秒表显示等控件进行合理布局设计,力求界面美观简洁。

2、添加控件的事件监听

在进行界面设计完成之后进行的工作是对相应的控件添加函数监听,在这里调用的是ActionListener接口,并且重写其中的actionPerformed方法,在其中对“确认修改”、“启动秒表”、“暂停”这三个按钮添加监听,并且在相应的监听中添加事件,以至于在点击按钮时候可以触发相应的事件。以下是对actionPerformed方法的重写

        @Overridepublic void actionPerformed(ActionEvent e) {// 如果点击了确认修改按钮if (e.getSource() == amend_JB) {//获取到下拉框的值String hour_amend = hourAmend.getSelectedItem().toString();String minute_amend = minuteAmend.getSelectedItem().toString();String second_amend = secondAmend.getSelectedItem().toString();//JOptionPane.showMessageDialog(null, "修改成功!");isThreadShow = false;   //设置线程标记为False,中止线程//将修改的值进行显示hourShow.setText(hour_amend);minuteShow.setText(minute_amend);secondShow.setText(second_amend);System.out.println("修改的时间是:" + hour_amend + ":" + minute_amend + ":" + second_amend);threadAmend.start();//启动修改后运行时间的线程}//如果点击了启动秒表的按钮if (e.getSource() == second_JB) {//如果当前秒表是启动状态,也就是显示的是让停止计时if (second_JB.getText() == "停止计时") {second_JB.setText("启动秒表");second_JB.setBackground(Color.yellow);//threadSecond.stop();isStartSecond = false;}else {//如果当前秒表是关闭状态         second_JB.setText("停止计时");second_JB.setBackground(Color.RED);threadSecond.start();//启动秒表线程isStartSecond = true;}                         }//如果点击了暂停按钮if (e.getSource() == pause_JB) {if (pause_JB.getText() == "暂停") {pause_JB.setText("继续");pause_JB.setBackground(Color.cyan);threadSecond.suspend();      //使该线程暂停}else {pause_JB.setText("暂停");pause_JB.setBackground(Color.RED);threadSecond.resume();        //使该线程继续}}}

3、通过主线程对时间实时显示

对按钮控件添加了监听函数之后,是对当前时间的显示,时间的显示是使用主线程,并且在主线程中每一秒更新显示一次数据,在这里使用的是Date类进行系统时间的读取,并且再利用SimpleDateFormat将获取到的时间进行规范化处理,之后将经过处理后得到的年、月、日、星期、以及当前的时间在界面中进行显示出来,

        @Overridepublic void run() {while (true) {// TODO Auto-generated method stubDate date = new Date();        //实例化时间类对象//将当前获取到的时间规范化SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");SimpleDateFormat monthFormat = new SimpleDateFormat("MM");SimpleDateFormat dayFormat = new SimpleDateFormat("dd");SimpleDateFormat weekFormat = new SimpleDateFormat("EEEE");SimpleDateFormat hourFormat = new SimpleDateFormat("HH");SimpleDateFormat minuteFormat = new SimpleDateFormat("mm");SimpleDateFormat secondFormat = new SimpleDateFormat("ss");//获取到当前的年、月、日、时、分、秒year = yearFormat.format(date);month = monthFormat.format(date);day = dayFormat.format(date);week = weekFormat.format(date);hour = hourFormat.format(date);minute = minuteFormat.format(date);second = secondFormat.format(date);hourShow.setText(hour);minuteShow.setText(minute);secondShow.setText(second);timeShow.setText(year + "年" + month + "月" + day + "日" + week);try {Thread.sleep(1000);      //让线程每一秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//如果线程中止,跳出循环if (!isThreadShow) {break;}}}

4、启用线程实现对时间的修改

在将系统时间显示出来之后,是对当前时间修改的操作,在这里的设计思路是,首先获取到修改的时间,然后利用break跳出主线程的循环,从而结束主线程的运行,之后将已经读取到的修改的时间在显示时间的标签中进行显示,同时开启修改后继续进行时间运行的threadAmend线程,并且每一秒更新一次,以至于时间可以不断的在已经修改过的基础上继续执行。效果如下图:

                //设置threadAmend线程threadAmend = new Thread(new Runnable() {@Overridepublic void run() {while (true) {int hourAmend = Integer.parseInt(hourShow.getText());int minuteAmend = Integer.parseInt(minuteShow.getText());int secondAmend = Integer.parseInt(secondShow.getText());secondAmend++;//对获取到的时间进行判断并作出处理if (secondAmend == 60) {minuteAmend++;secondAmend = 0;}if (minuteAmend == 60) {hourAmend++;minuteAmend=0;}if (hourAmend == 24) {hourAmend = 0;minuteAmend = 0;secondAmend = 0;}//将时间进行显示hourShow.setText(Integer.toString(hourAmend));minuteShow.setText(Integer.toString(minuteAmend));secondShow.setText(Integer.toString(secondAmend));try {threadAmend.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}});

5、线程同步实现秒表功能

在修改时间的同时,会设定进行秒表运行的threadSecond线程,该线程的使用是在点击“启动秒表”按钮之后启动该线程,同时在后台开始计时,每秒对数据更新一次,之后在“暂停”按钮中添加事件,在点击“暂停”之后可以将threadSecond暂停,同时此按钮变成“继续”,在点击继续之后,threadSecond线程会继续执行,直到点击了“停止计时”之后,该线程将会跳出循环中止。效果如下图:

                //设置threadSecond秒表线程threadSecond = new Thread(new Runnable() {@Overridepublic void run() {//在每次开启秒表时,将数据初始化为0hourSecond = 0;minuteSecond = 0;secondSecond = 0;while (true) {secondSecond++;        //秒数加1//对获取到的时间进行判断并作出处理if (secondSecond == 60) {minuteSecond++;secondSecond = 0;}if (minuteSecond == 60) {hourSecond++;minuteSecond=0;}String SecondText = Integer.toString(hourSecond) + ":" +  Integer.toString(minuteSecond) + ":" + Integer.toString(secondSecond);second_Time.setText(SecondText);try {threadSecond.sleep(1000);   //让线程每次休息一秒} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//如果监控秒表线程的StartSecond为falsh,跳出循环if (!isStartSecond) {isStartSecond = true;break;}}}});

6、运行并进行调试

在最后的秒表线程完成之后,整个电子表的开发就完成了,之后在主函数中直接调用该类即可运行成功。

 public static void main(String[] args) {ElectronicClock eClock = new ElectronicClock();        }

效果如下:

觉得不错记得点赞关注哟!

完整源码点击此处即可下载,

或源码链接:https://pan.baidu.com/s/1Zc1XEp2tSDM7nKOykPEKDQ

提取码:u2co

深度讲解Java多线程开发—电子表项目实现相关推荐

  1. mongodb视频教程云盘,深度讲解Java多线程开发—电子表项目实现

    // 如果点击了确认修改按钮if (e.getSource() == amend_JB) {//获取到下拉框的值String hour_amend = hourAmend.getSelectedIte ...

  2. Java高级开发0-1项目实战-青鸟商城-Day03

    作者:田超凡 原创博文,严禁复制转载,仿冒必究 项目计划 第三天: 前台系统搭建 商城首页展示 Cms系统的实现 内容分类管理 内容管理 前台内容动态展示 1. 商城首页展示 系统架构: 页面位置: ...

  3. kotlin与java混合开发_使用kotlin和Java混合开发Android项目爬坑记录

    使用kotlin和Java混合开发Android项目爬坑记录 不定期将开发过程中遇到的问题添加在此处,加深记忆. 主要内容包括但不限于java与kotlin语言的一些区别,以及在使用android-s ...

  4. Java多线程开发系列之四:玩转多线程(线程的控制2)

    在上节的线程控制(详情点击这里)中,我们讲解了线程的等待join().守护线程.本节我们将会把剩下的线程控制内容一并讲完,主要内容有线程的睡眠.让步.优先级.挂起和恢复.停止等. 废话不多说,我们直接 ...

  5. Java多线程开发(一)Java多线程编程简介

    文章目录 参考 Java线程简介 Thread类构造方法和属性 常用Thread类方法 线程的生命周期 多线程编程的优势和风险 安全性问题 活跃性问题 性能问题 参考 [Java并发系列01]Thre ...

  6. java 多线程开发注意事项

    多线程开发的三大特性 有序性 可见性 对修改后的数据可以看到拥有可见性 原子性 代码在执行的时候必须一次执行完,一次成功或者是一次失败,一次线程对一段代码有掌控,就像事务里面的原子一样 线程,本地内存 ...

  7. java多线程开发 如何正确关闭线程

    在java高级开发中,经常会碰到多线程,关于线程的关闭,可能会用stop() 方法,但是所有的停止方法都被废弃了,(暂停和继续的方法也是被废弃掉的),为什么不能简单的停止呢? 假如说有两个线程,其中有 ...

  8. java线程内存模型_深度解析Java多线程的内存模型

    内部java内存模型 硬件层面的内存模型 Java内存模型和硬件内存模型的联系 共享对象的可见性 资源竞速 Java内存模型很好的说明了JVM是如何在内存里工作的,JVM可以理解为java执行的一个操 ...

  9. Java高级开发0-1项目实战-青鸟商城-Day01

                                       作者:田超凡                        原创博文,严禁复制转载,仿冒必究 1 项目计划 第一天: 电商行业的背 ...

最新文章

  1. 【科普】AI的分类与演进
  2. 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面
  3. aws lambda_通过Spring将AWS SQS用作JMS提供程序
  4. 我的Android进阶之旅------gt;Android使用AlarmManager全局定时器实现定时更换壁纸
  5. 多项式输出pascal程序
  6. linux安装mysql(shell一键安装)
  7. Android设计模式之——工厂方法模式
  8. Linux上的.NET框架Mono 2.0发布
  9. python寻峰算法_现代法谱估计(1)Yule Walker 方程法MATLAB及Python实现
  10. 吴恩达机器学习作业二——逻辑回归
  11. 计算机存储T,GB,MB,KB,B,bit
  12. 系统服务器ping偶尔超时,云服务器ping超时原因
  13. 网页爬虫实例一(网页截屏)
  14. Delphi版 熊猫烧香源码
  15. 虚假唤醒spurious wakeup
  16. 【thinkphp 基础 3】配合phpstudy进行验证码拓展安装
  17. AI教程:自定义参考线
  18. 通用权限管理设计篇(一)
  19. 如何把手机app的视频下载到手机上?网页上的视频怎么下载?
  20. pdf表格怎么转换成excel呢?

热门文章

  1. linux运行文件命令
  2. Vue组件的八个钩子函数
  3. Android刘海屏如何适配?一份详细的Android刘海屏、水滴屏全面屏适配方案
  4. 火星文字(PAT-1044)
  5. c语言作业 求1到n的阶乘和,C语言,计算1到n的阶乘求和问题
  6. 【调剂】北京物资学院2023年预计招计算机学硕和电子信息专硕调剂!
  7. 【前端面试必读】js排序的几种方法
  8. php合并数组,不使用函数array_merge()
  9. dubbo之9种rpc协议
  10. 碟片管理系统代码重构示例