秒表计时器——Java基础练手项目(Java课程设计)
前言:鄙人是大二在读学生,大二上学期Java课程设计选了一个秒表计时器的题目,在此把代码和心得分享出来(懒人可以直接看PPT)。鄙人资历尚浅,代码中会有许多不当之处,望各位大佬海涵,有更好的建议希望各位大佬留言评论区。
题目要求
设计一个与手机秒表类似的计时器,以钟表图形的方式呈现。
- 当用户用鼠标单击界面的“开始”按钮或图标时,秒表开始计时,表及数字都自动发生变化;当用户再次点击按钮,秒表暂停计时,按钮字样变为“继续”;当用户用鼠标点击“继续”按钮,秒表继续计时。
- 界面上还有一个“复位”按钮,当未点击“开始”按钮,没有进入计时状态时,“复位”按钮为灰色不可选,当开始计时后,“复位”按钮变为可选状态,当用户点击复位按钮时,秒表计时清零。
设计思路
- 首先利用java中的swing创建窗口,及其相关的组件,构造出大概的图像,如下图
- 然后利用java中的计时器类(Timer),让指针随着时间转动(本来有视频演示的,但是奈何视频鄙人还不会插入……)
- 接着声明一些变量(例如haveStart,isStop,number)来帮助判断秒表的状态(如下图)
- 结合静态变量,给三个按钮添加事件监听(jp_*为第*个按钮)
//手动换行分开三个按钮(手动滑稽)
//手动换行分开三个按钮(手动滑稽)
- 使用jdbc技术连接java程序和mysql数据库(这个题目里面是没有要求的,但是想着完美一点就加上去了,下面3张图为代码演示和结果演示)
//手动换行分开图片(手动滑稽)
//手动换行分开图片(手动滑稽),下面这张图是数据库存储后的结果,为了方便展示直接使用了数据库管理系统的可视化工具navicat
程序分析
程序能够符合题目的所有要求,并且结合实际考虑,在题目要求之外添加了如下几个功能:
- 在未点击开始按钮时,暂停按钮也设置成灰色不可点击的状态
- 在未点击开始前,点击暂停或者复位按钮的话,会有弹窗提醒,告诉使用者“程序未开始,此按钮不可选!”
- 在窗口右侧添加了多行文本域,可以展示在一次使用中的多次记录的次序和时长
- 使用了JDBC技术连接了java程序和mysql数据库,可以在点击复位按钮时自动把每次记录的次序,时长,记录的时间存入数据库中,便于数据的保存和查询。
程序的不足之处:
- 因为采用了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课程设计)相关推荐
- python3实战练手项目_Python0基础练手项目有哪些值得推荐?附实战项目+学习图谱...
原标题:Python 0基础练手项目,有哪些值得推荐?附实战项目+学习图谱 刚学Python的时候,因为豆瓣帖子老沉,就写了一个顶帖脚本.就是用这个脚本,给自己的帖子顶了两年,在小组里追到了现在的女朋 ...
- 10个相见恨晚的 Java 在线练手项目
前一篇:?[清单]37个超棒的 Web 数据可视化工具 Java 开发简单的计算器 难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习 推荐指数:????? 在线实操链接 制作 ...
- java 适合练手的java项目
Java作为一门古老的语言,已有20年左右的历史,这在发展日新月异的技术圈可以说是一个神话. 虽然不少人曾抱怨Java语言就像老太太的裹脚布,又臭又长,有时写了500行都不能表达程序员的意图. 但从市 ...
- 整理10类Java毕设练手项目,献给帅帅的计算计专业毕业人
每次到了写毕业设计的时候,计算机专业的同学们就开始头疼,想自己写,但是大学学的东西...一言难尽,远远不足以支撑我们写出一个完整的项目:就算学的比较好的同学,会写一两个项目,到了选题的时候,傻眼了,刚 ...
- 有什么值得推荐的Java Web练手项目?
https://www.zhihu.com/question/29444491 转载于:https://www.cnblogs.com/jrsflak/p/7880849.html
- python零基础实例-python零基础练手项目100+
文章目录 Python3 100例 实例001:数字组合 实例002:"个税计算" 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契数列 ...
- python练手经典100例-python零基础练手项目100+
文章目录 Python3 100例 实例001:数字组合 实例002:"个税计算" 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契数列 ...
- Python基础练手项目❤绘制美味月饼
前言 马上就要中秋节了,在外漂泊的各位小伙伴也没有时间能赶回家陪陪家人,但是出门在外,月饼还是要吃的呀,给掘金的每个小伙伴送上给种口味样式的月饼,白又白已经帮你端上餐桌了,各位大大请品尝!!!! 效果 ...
- JavaWeb练手项目ATM机
目录 引言 开发环境 所用技术 项目目录 数据库设计 功能介绍 源码下载 更多优质练手项目 Java学生成绩管理系统 Java个人博客项目 Java图书管理系统 Java电子发票管理系统 引言 这个项 ...
最新文章
- MongoDB 维护Replica Set
- Python中numpy数组的拼接、合并
- Dubbo源码分析(三)Dubbo中的SPI和自适应扩展机制
- HDU 1010 Tempter of the Bone heuristic 修剪
- c语言扫描图片的坐标,tc 如何在指定坐标处 输出bmp图片??
- 217 Contains Duplicate
- Java 相关计数问题及其实现
- css_02 | CSS——CSS 选择器详解
- GNS3下载安装和使用、本地主机虚拟网卡消失解决方案以及环回网卡添加与测试
- MQTT服务器的搭建与MQTT客户端的使用
- 北大慕课(郭炜):程序设计与算法(一)编程题答案(全)
- java计算机毕业设计西藏民族大学论文管理系统源程序+mysql+系统+lw文档+远程调试
- 新浪股权分散是把双刃剑
- arccatalog点要素显示不完_shp文件转为dwg之后在arcgis下打开属性表有高程信息但在cad里面打开为何没高程 - 地学 - 小木虫 - 学术 科研 互动社区...
- cocos之游戏手柄控制实例
- Go语言处理Windows系统的图标ICO文件(下)
- php人民币小写转大写函数
- Tennessee Eastman(TE过程)简介
- 剑指offer_4 二叉树遍历
- erdas查看灰度直方图_ERDAS图像的基本操作