前言:鄙人是大二在读学生,大二上学期Java课程设计选了一个秒表计时器的题目,在此把代码和心得分享出来(懒人可以直接看PPT)。鄙人资历尚浅,代码中会有许多不当之处,望各位大佬海涵,有更好的建议希望各位大佬留言评论区。

题目要求

设计一个与手机秒表类似的计时器,以钟表图形的方式呈现。

  1. 当用户用鼠标单击界面的“开始”按钮或图标时,秒表开始计时,表及数字都自动发生变化;当用户再次点击按钮,秒表暂停计时,按钮字样变为“继续”;当用户用鼠标点击“继续”按钮,秒表继续计时。
  2. 界面上还有一个“复位”按钮,当未点击“开始”按钮,没有进入计时状态时,“复位”按钮为灰色不可选,当开始计时后,“复位”按钮变为可选状态,当用户点击复位按钮时,秒表计时清零。

设计思路

  •   首先利用java中的swing创建窗口,及其相关的组件,构造出大概的图像,如下图
  • 然后利用java中的计时器类(Timer),让指针随着时间转动(本来有视频演示的,但是奈何视频鄙人还不会插入……)
  • 接着声明一些变量(例如haveStart,isStop,number)来帮助判断秒表的状态(如下图)

  • 结合静态变量,给三个按钮添加事件监听(jp_*为第*个按钮)

//手动换行分开三个按钮(手动滑稽)

//手动换行分开三个按钮(手动滑稽)

  • 使用jdbc技术连接java程序和mysql数据库(这个题目里面是没有要求的,但是想着完美一点就加上去了,下面3张图为代码演示和结果演示)

//手动换行分开图片(手动滑稽)

//手动换行分开图片(手动滑稽),下面这张图是数据库存储后的结果,为了方便展示直接使用了数据库管理系统的可视化工具navicat

程序分析

程序能够符合题目的所有要求,并且结合实际考虑,在题目要求之外添加了如下几个功能:

  1. 在未点击开始按钮时,暂停按钮也设置成灰色不可点击的状态
  2. 在未点击开始前,点击暂停或者复位按钮的话,会有弹窗提醒,告诉使用者“程序未开始,此按钮不可选!”
  3. 在窗口右侧添加了多行文本域,可以展示在一次使用中的多次记录的次序和时长
  4. 使用了JDBC技术连接了java程序和mysql数据库,可以在点击复位按钮时自动把每次记录的次序,时长,记录的时间存入数据库中,便于数据的保存和查询。

程序的不足之处:

  1. 因为采用了Java Swing中的组件来构造钟表,所以钟表图形简陋,窗口上的单行文本域和多行文本域也显得有些呆滞

心得与体会

在这个课程设计中遇到的难题及其解决方案:

1. 导包错误

这个课程设计中使用到了java中的计时器类(Timer),但是由于之前没有接触过这个类,所以是通过一些视频,及百度才知道了这个类,使用这个类是需要导包的,但是不止一个包含有这个类,当时我下意识的导了java.swing这个包,因为这个课程设计很多都用到了swing,导致程序报错(见下图),但是明明我和百度和视频上的几乎一模一样,在漫长的折磨下,我才想到可能是导错包了。

解决方案:在java的API文档和百度搜索上比较详细的了解了这个类在不同包下的使用之后,挑选了一个比较合适的包导入,并且修改java语句,尝试完成自己让指针转动的需求

2.版本不匹配问题  

我在电脑上配置的mysql的版本是5.7.36,然后用到的jdbc的jar是最新的8.0.27版本的,所以在起初看视频学习jdbc技术时,敲着一模一样的代码,但是我这里会报错(见下图),这就让人十分苦恼,难以继续学习下去    

 

解决方案:在官网上找到对应版本的jdbc的jar文件(即5.7.36版本的jdbc的jar文件),然后把这个文件配置到运行环境中

几个有用的网址:

1. Overview - Java 11中文版 - API参考文档

Java中文在线帮助文档

2.https://mvnrepository.com/artifact/mysql/mysqlconnector-java

可以很容易获取Jdbc中任意版本的jar包

3. 百度一下,你就知道

可以解答我们目前为止在编程上遇到的90%的问题

源码

package Miaobiao;import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.awt.*;
import java.util.*;
import java.util.Date;
import java.util.Timer;public class MiaoBiao {//获得记录的时间SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss ");Date date = new Date(System.currentTimeMillis());String s;// 创造各个组件final static double pai = 3.14159;JFrame jf = new JFrame("秒表窗口");JPanel jp_one = new JPanel();JPanel jp_two = new JPanel();JPanel jp_three = new JPanel();static int location_x = 0;static int location_y = 110;static MyCanvas myCanvas = new MyCanvas();JButton jb_one = new JButton("开始");JButton jb_two = new JButton("暂停");JButton jb_three = new JButton("复位");// 未开始时点击复位弹出的对话框JDialog jd = new JDialog(jf, true);JTextArea jta = new JTextArea("程序未开始,此按钮不可选!");static JTextField tf = new JTextField(10);JTextArea ta = new JTextArea(30, 10);// 设置一个变量来观察秒表是否暂停static boolean isStop = true;// 设置一个变量记录时间static private int t = 0;// 设置一个变量是否开始static boolean haveStart = false;// 设置一个变量记录秒表运行次数static int number = 0;private static class MyTimer extends TimerTask {@Overridepublic void run() {if (isStop) {} else {//更新指针终点的x,y坐标,并且更新单行文本域的内容t++;location_x = (int) (Math.cos((pai / 2 - t * pai / 30)) * 110);location_y = (int) (Math.sin((pai / 2 - t * pai / 30)) * 110);tf.setText("" + t + "秒");myCanvas.repaint();}// TODO Auto-generated method stub}}/*  void  Jdbc() throws SQLException{  Driver driver =new com.mysql.jdbc.Driver();String url="jdbc:mysql://localhost:3306/miaobiao";Properties info =new Properties();info.setProperty("user", "root");info.setProperty("password", "root");Connection conn=driver.connect(url, info);String sql="insert into record(number,time,date) values(?,?,?)";PreparedStatement ps=conn.prepareStatement(sql);ps.setInt(1, number);ps.setString(2, t+"秒");ps.setString(3,s);ps.execute();ps.close();conn.close();}*/// 组装函数public void init() {// 设置弹窗内容jd.setBounds(300, 300, 300, 200);jd.setTitle("错误!");jd.add(jta);// jd.setTe// 给复位按钮设置成灰色jb_two.setBackground(Color.gray);jb_three.setBackground(Color.gray);// 给按钮添加事件监听jb_one.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (jb_two.getActionCommand().equals("暂停")) {isStop = false;haveStart = true;jb_two.setBackground(new Color(236, 242, 248));jb_three.setBackground(new Color(236, 242, 248));}}});jb_two.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// 判断这个按钮当前的状态if (!haveStart && e.getActionCommand().equals("暂停")) {jd.setVisible(true);} else if (haveStart && e.getActionCommand().equals("暂停")) {isStop = true;jb_two.setText("继续");} else {isStop = false;jb_two.setText("暂停");}}});jb_three.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (haveStart) {// 更新成员变量的属性值isStop = true;haveStart = false;location_x = 0;location_y = 110;jb_two.setText("暂停");// 在右边的文本域中更新内容ta.append("第" + (++number )+ "次:" + t + "秒" + "\n");//写入数据库/* try {date = new Date(System.currentTimeMillis());s=formatter.format(date);Jdbc();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}*/t = 0;tf.setText("");// 给两个按钮回复颜色jb_three.setBackground(Color.gray);jb_two.setBackground(Color.gray);myCanvas.repaint();} else {jd.setVisible(true);}}});// 给三个面板添加组件myCanvas.setSize(new Dimension(360, 360));//myCanvas.setBackground(Color.blue);jp_one.add(myCanvas);jp_one.add(tf);jp_two.add(jb_one);jp_two.add(jb_two);jp_two.add(jb_three);jp_three.add(ta);// 给窗口添加三个面板jf.add(jp_one, BorderLayout.CENTER);jf.add(jp_two, BorderLayout.SOUTH);jf.add(jp_three, BorderLayout.EAST);// 设置窗口位置,大小,可见性,添加窗口关闭监听jf.setBounds(200, 200, 500, 500);jf.setVisible(true);//jf.addWindowListener(new MyListener());jf.setDefaultCloseOperation(1);Timer timer = new Timer();timer.schedule(new MyTimer(), 0, 1000);}public static void main(String[] args) {new MiaoBiao().init();}// 创建画布private static class MyCanvas extends Canvas {@Overridepublic void paint(Graphics g) {// 绘制钟表图g.drawOval(60, 40, 250, 250);g.setFont((new Font("Times", Font.BOLD, 30)));g.drawString("12", 170, 65);g.drawString("3", 290, 175);g.drawString("6", 178, 288);g.drawString("9", 62, 175);g.drawString("1", 235, 80);g.drawString("2", 275, 120);g.drawString("4", 275, 235);g.drawString("5", 235, 275);g.drawString("7", 126, 275);g.drawString("8", 80, 235);g.drawString("10", 75, 120);g.drawString("11", 115, 80);// 绘制指针,利用计时器更新 a b 的值使指针不停的转动int a = 185 + location_x;int b = 165 - location_y;g.drawLine(185, 165, a, b);}}
}

注:为了让代码能够成功运行,有关数据库部分的代码被注释了。(注释掉的部分:第67-83行,第133-140行)

另附本人的实验报告文档与分享会的PPT:

链接:https://pan.baidu.com/s/17FUTWmdxrha2Lpy8aARPyQ 
提取码:zlry

好了~第一篇博客到此就结束了,大家对这个课程设计有什么问题可以在评论区留言~也欢迎各位大佬提出宝贵的修改意见~

秒表计时器——Java基础练手项目(Java课程设计)相关推荐

  1. python3实战练手项目_Python0基础练手项目有哪些值得推荐?附实战项目+学习图谱...

    原标题:Python 0基础练手项目,有哪些值得推荐?附实战项目+学习图谱 刚学Python的时候,因为豆瓣帖子老沉,就写了一个顶帖脚本.就是用这个脚本,给自己的帖子顶了两年,在小组里追到了现在的女朋 ...

  2. 10个相见恨晚的 Java 在线练手项目

    前一篇:?[清单]37个超棒的 Web 数据可视化工具 Java 开发简单的计算器 难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习 推荐指数:????? 在线实操链接 制作 ...

  3. java 适合练手的java项目

    Java作为一门古老的语言,已有20年左右的历史,这在发展日新月异的技术圈可以说是一个神话. 虽然不少人曾抱怨Java语言就像老太太的裹脚布,又臭又长,有时写了500行都不能表达程序员的意图. 但从市 ...

  4. 整理10类Java毕设练手项目,献给帅帅的计算计专业毕业人

    每次到了写毕业设计的时候,计算机专业的同学们就开始头疼,想自己写,但是大学学的东西...一言难尽,远远不足以支撑我们写出一个完整的项目:就算学的比较好的同学,会写一两个项目,到了选题的时候,傻眼了,刚 ...

  5. 有什么值得推荐的Java Web练手项目?

    https://www.zhihu.com/question/29444491 转载于:https://www.cnblogs.com/jrsflak/p/7880849.html

  6. python零基础实例-python零基础练手项目100+

    文章目录 Python3 100例 实例001:数字组合 实例002:"个税计算" 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契数列 ...

  7. python练手经典100例-python零基础练手项目100+

    文章目录 Python3 100例 实例001:数字组合 实例002:"个税计算" 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契数列 ...

  8. Python基础练手项目❤绘制美味月饼

    前言 马上就要中秋节了,在外漂泊的各位小伙伴也没有时间能赶回家陪陪家人,但是出门在外,月饼还是要吃的呀,给掘金的每个小伙伴送上给种口味样式的月饼,白又白已经帮你端上餐桌了,各位大大请品尝!!!! 效果 ...

  9. JavaWeb练手项目ATM机

    目录 引言 开发环境 所用技术 项目目录 数据库设计 功能介绍 源码下载 更多优质练手项目 Java学生成绩管理系统 Java个人博客项目 Java图书管理系统 Java电子发票管理系统 引言 这个项 ...

最新文章

  1. MongoDB 维护Replica Set
  2. Python中numpy数组的拼接、合并
  3. Dubbo源码分析(三)Dubbo中的SPI和自适应扩展机制
  4. HDU 1010 Tempter of the Bone heuristic 修剪
  5. c语言扫描图片的坐标,tc 如何在指定坐标处 输出bmp图片??
  6. 217 Contains Duplicate
  7. Java 相关计数问题及其实现
  8. css_02 | CSS——CSS 选择器详解
  9. GNS3下载安装和使用、本地主机虚拟网卡消失解决方案以及环回网卡添加与测试
  10. MQTT服务器的搭建与MQTT客户端的使用
  11. 北大慕课(郭炜):程序设计与算法(一)编程题答案(全)
  12. java计算机毕业设计西藏民族大学论文管理系统源程序+mysql+系统+lw文档+远程调试
  13. 新浪股权分散是把双刃剑
  14. arccatalog点要素显示不完_shp文件转为dwg之后在arcgis下打开属性表有高程信息但在cad里面打开为何没高程 - 地学 - 小木虫 - 学术 科研 互动社区...
  15. cocos之游戏手柄控制实例
  16. Go语言处理Windows系统的图标ICO文件(下)
  17. php人民币小写转大写函数
  18. Tennessee Eastman(TE过程)简介
  19. 剑指offer_4 二叉树遍历
  20. erdas查看灰度直方图_ERDAS图像的基本操作

热门文章

  1. MyHDL中文手册(六)—— RTL建模
  2. javaweb mysql购物车_javaweb购物车实现的几种方式
  3. php如何在图片上写字,php在图片上写字并生成图片
  4. jsp执行原理(详解)
  5. Java开发专家阿里P6-P7面试题大全及答案汇总(持续更新)
  6. HTML淘宝购物车页面的实现
  7. 计算机网络:网络安全
  8. matlab 验证两个电阻并联误差会变小
  9. [AGC001E]BBQ Hard
  10. 密码学之RSA与AES加密解密在项目中的应用