1、JAVA时钟程序编 号: Z04500052学 号: 2 课 程 设 计教 学 院计算机学院课程名称JAVA课程设计题 目时钟程序专 业13应用技术班 级应用技术(1)班姓 名张琳同组人员刘敏 陈碧菲 周丹丹 田琼玲指导教师伍红华2014 年 6 月 15 日七. 附录.8八. 参考文献.9一.问题分析和任务定义1.问题分析此次课程设计的题目为简单的小时钟程序设计,通过做巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK等开发工具的运用,拓宽常用类库的应用。 运用了鼠标的监听和事件的监听以及侦听的技术来时钟的功能。 时钟可以分为:电子时钟,数字时钟。其中数字时钟包括表盘,数字
2、,指针。用JPanel类来指定布局管理器,同时新增一个功能也是设计需求的功能,可以随时的调时间,运用到鼠标和按钮的监听效果来完成调时间的功能。2.任务定义 基本功能:打开java工作界面,有很明显的数字时钟在界面上,并且指针在走动,数字钟的显示以本地系统时间而定,一秒钟跳动一次,若本地系统时间发生改变,则数字钟的时、分、秒也随着改变,左上角并拥有与电脑同步的时间日期与星期用数字直接显示出来。 基本实现:定义窗口类继承import javax.swing.JFrame;类并实现ActionListener接口,在窗口类中定义成员变量,用于表示窗口中菜单、文本框,定义成员方法actionPerfo
3、rmed,用于事件处理。3.任务分工 (1)图形界面设置关闭窗口(田琼玲) (2)显示时钟桌面(陈碧菲) (3)实现接口 runnable的方法run,用来刷新时分秒三指针的度数(刘敏) (4)方法重写 绘制钟面各元素(张琳) (5)将电脑时间日期进行同步,并显示出来,用switch语句实现多分支选择结构(周丹丹)二.逻辑设计1.包 java.awt包,包含构成抽象窗口的工具集(abstrsct window toolkit)的多个类,用来构建和管理应用程序的图形用户界面(GUI)。 java.Swing包,扩充和增强图形用户界面功能。 java.awt.event包,提供接口和类来处理不同类
4、型的事件触发的AET组件。 java.text包,提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.util包,包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.awt.event包,提供处理由 AWT 组件所激发的各类事件的接口和类。 javax.swing.event包,供 Swing 组件触发的事件使用。 2.类的设计 (1)Color类:Color类用来定义颜色,包括图形背景的颜色,表盘的颜色,指针的颜色,数字的颜色。 (2)Data D
5、ateFormat,SimpleDateFormat :该类是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。单位是毫秒。其中SimpleDateFormat类是对日期/时间格式化子类允许进行格式化 (3)Calender类:Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得日期)提供了一些方法,瞬间可用毫秒值来表示。 (4)Date类:Date类用来表示特定的瞬间,时间精确到毫秒。 (5)JFrame类:该类用来控制窗格和根窗格 (6)J
6、Panel类:JPanel 是一般轻量级容器。可以用来指定布局管路器。 (7)JButton类:该类定义按钮,并且实现按钮 (8)ActionEvent接口:指示发生了组件定义的动作的语义事件。当特定的组件动作(比如被按下)发生时,由组件(比如 Button)生成此高级事件。事件被传递给每一个 ActionListener 对象,所以要实现ActionListener的接口。 (9)Timer类:在指定时间间隔触发一个或多个 ActionEvent。它将 Timer 用作绘制其帧的触发器。 (10)JSpinner:该类用来让用户从一个有序序列中选择一个数字或者一个对象值的单行输入字段。Spi
7、nner 通常提供一对带小箭头的按钮以便逐步遍历序列元素允许用户在 spinner 中直接输入合法值。 3.主要内容创建一个钟表。借助swing类和接口内部类的实现,在本程序中以实现Runnable接口内部类的形式创建多线程对象。Runnable接口只定义了一个run()方法,所以调用start和sleep()方法时,必须创建Thread实例化对象。Interrupt()方法的作用是中断线程。其作用方式是:多线程对象.interrupt()。4.整体流程 类的总体名字为clock,实现ActionListener接口,鼠标的监听器实现此程序。 先运用构造函数画一个长和宽都为300的圆,并且设置
8、颜色为黑色,固定其窗口调整为拉动不可变定义setVisible(true),就是调整窗口可保持不变。画圆画完圆之后在圆上设置12个数字,运用math函数方法来绘制时间,并且把每个时间的位置用函数关系调整好。在圆上设置时针,要用到math类,来绘制时针并且用函数来控制时针的走动和相对应的位置。color类来控制颜色,这里定为青色。定义时针的变量类型为string类型的成员变量,设置名称为Hour。在圆上设置分针,要用到math类,来绘制时针并且用函数来控制时针的走动和相对应的位置。color类来控制颜色,这里定为蓝色。定义时针的变量类型为string类型的成员变量,设置名称为Minute。 在圆
9、上设置秒针,要用到math类,来绘制时针并且用函数来控制时针的走动和相对应的位置。color类来控制颜色,这里定为红色。定义时针的变量类型为string类型的成员变量,设置名称为Second。 在这些设置完后,需要对其进行监控就要用到ActionPerformed方法,对事件的监控和ActionEvent接口并且递给每一个 ActionListener 对象,所以还要创建一个类实现ActionListener接口。 最后编写主函数:其中有三个成员变量,以图的形式来展示Clock类成员变量成员变量分类描述变量类型名称时针StringHour分针StringMinute秒针StringSecond
10、2.程序主流程图 三.详细设计程序主功能图 本次实训上机操作中,我负责的为方法的“重写 绘制钟面各元素,方法的重写极为子类可继承父类中的方法,而不需要重新编写相同的方法。Public void paint(Graphics g)paint()就是一个画笔方法,用来在屏幕上绘制你所需要绘制的东西。要是想屏幕上绘制东西就得先用Grapahics把东西绘制到内存里去再由repaint();方法显示到屏幕上去。设置左上角的坐标为(0,0),并以半径为8用黑色进行背景填充颜色,后又画圆的轮廓即为表盘的轮廓,再用三种颜色分别构造不同长短大小的指针,最后利用两个for循环分别在表盘内运用g.drawStri
11、ng根据调用的函数算法在表盘内相应的坐标位置进行画点与数字的显示。四.程序编码个人任务“方法重写 绘制钟面各元素”代码public void paint(Graphics g) / 清屏 super.paint(g); g.setColor(Color.BLACK);/用黑色 g.fillRect(0, 0, r * 3, r * 3);/填充一个黑色的矩形做为背景 / 画圆 g.setColor(Color.WHITE);/用白色 g.drawOval(x, y, r * 2, r * 2);/画出表盘的轮廓 / 用红色画秒针 g.setColor(Color.RED); int x1 =
12、(int) (r - 10) * Math.sin(rad * s); int y1 = (int) (r - 10) * Math.cos(rad * s); g.drawLine(x + r, y + r, x + r + x1, y + r - y1); / 用蓝色画分针 g.setColor(Color.BLUE); x1 = (int) (r - r / 2.5) * Math.sin(rad * m); y1 = (int) (r - r / 2.5) * Math.cos(rad * m); g.drawLine(x + r, y + r, x + r + x1, y + r -
13、 y1); / 用青色画时针 g.setColor(Color.CYAN); x1 = (int) (r - r / 1.5) * Math.sin(rad * h); y1 = (int) (r - r / 1.5) * Math.cos(rad * h); g.drawLine(x + r, y + r, x + r + x1, y + r - y1); / 用黄色画表盘上的数字 g.setColor(Color.YELLOW); int d = 29; for (int i = 1; i = 12; i+) x1 = (int) (r - 10) * Math.sin(rad * d);
14、 y1 = (int) (r - 10) * Math.cos(rad * d); g.drawString(i + , x + r + x1 - 4, x + r - y1 + 5); d += 30; / 画小点,表示刻度 d = 0; for (int i = 0; i 60; i+) x1 = (int) (r - 2) * Math.sin(rad * d); y1 = (int) (r - 2) * Math.cos(rad * d); g.drawString(., x + r + x1 - 1, x + r - y1 + 1); d += 6; 五.程序调试与测试1.显示指针时
15、钟效果2.显示数字时钟效果部分代码:/ 获得时间、星期、日期 Calendar now1 = new GregorianCalendar();/获得当前的日期时间对象 int hour = now1.get(Calendar.HOUR_OF_DAY);/小时,获得当前的时刻 int minute = now1.get(Calendar.MINUTE);/分,同上 int second = now1.get(Calendar.SECOND);/秒 int year = now1.get(Calendar.YEAR);/年 int month = now1.get(Calendar.MONTH)+
16、1;/月 int date = now1.get(Calendar.DAY_OF_MONTH);/日 int week = now1.get(Calendar.DAY_OF_WEEK);/星期 System.out.println(week); /星期转换字符串 String weekDay = ; switch(-week) case 1:weekDay=一;break; case 2:weekDay=二;break; case 3:weekDay=三;break; case 4:weekDay=四;break; case 5:weekDay=五;break; case 6:weekDay=
17、六;break; case 0:weekDay=日;break; default :weekDay=;break; /显示时间、星期、日期 g2d.setColor(Color.PINK); g2d.drawString(hour10?0:)+hour+ : + (minute10?0:)+minute+ : + (second10?0:)+second + +(+weekDay+) + +year+ / + (month10?0:)+month+ / + (date10?0:)+date, 5, 15); 六.结果分析1.运行Clock.java 图2查看实时时间运行结果分析: 本程序运行结
18、果界面显示为黑色,并加入了12个刻度,指针颜色设置上也都是不一样的,左上角的时间日期显示与电脑上的进行了同步,并且运用了switch的星期转换字符串,当电脑上的时间发生改变的时候,钟上的指针也会跟着发生改变。2.设计总结通过本次JAVA的实训,我觉得学习基础很重要,本次试验的代码,经过了很多次的验证和修改,本来的只显示表盘和指针的基础上同步了电脑上的时间日期和星期,通过线程实现了运行,时钟程序虽然简单,但为了弄懂了解清楚,我们组也是花费了一定时间。这个时钟的设计上时钟表面有12个刻度,指针也是不同颜色的,最上面的则为同步的电脑时间与日期和星期,该时间与指针显示的时间也为一致的,但并没有实现对于
19、时间的重置。我想不断地进行对该设计的完善,不仅能为该始终设置背景,以增加该时钟的美观效果,也可以对始终到了一定的时间就可以报时,即闹钟功能的设置,为闹钟设置多种不同的音乐,也可供选择,这样的话就不显得单调,这样一来该时钟便可更方便实用这次试验也更让我了解到同组之间配合的重要,通过相互之间的沟通说出自己的想法也能增加别人的理解,从而学到更多的东西。本想在时钟程序中添加闹钟功能和时间修改的功能,但由于能力有限始闹钟功能只能将它单独运行出来,而不能组合在一起。本次实验中也遇到了许多的问题,有一些也都是以前没学习过的,也有自己粗心的问题,而制造出来的一些麻烦,但经过看书,查找资料,同学之间的相互交流针
20、对性的对不懂的问题进行查询,才让他们逐步得到解决,在将思路进行整理。这次的实训也让我理解到JAVA一些概念的重要性,我们自己本身也应该建立一个编程的思想,属性JAVA开发的环境,学习也不能局限在上课认真听讲,还需自主学习,课外时间多了解一些相关方面的知识,这样才能加快自己对专业知识的理解,另外,对于不懂的问题可以通过查阅资料或者咨询同学老师,让它得到解决,不能轻易地像代码认输,这样的话,面对困难你就畏缩,以后一定会一事无成的,在以后的时间里,我会努力学习,认真听课,深化知识,不断创新,继续强化自己的能力,这样才不能枉费我们在大学里所付出的时间和汗水,以及老师对于我们的教导与帮助,相信在以后的日
21、子里,通过我们自己的努力,我们一定可以成为一个有用的人。附录import java.awt.Color;import java.awt.Graphics;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.Calendar;import java.util.GregorianCalendar;import javax.swing.JFrame;import javax.swing.JPanel;/* * 时间类 * */public class ClockTest exte
22、nds JFrame private static final long serialVersionUID = 1L; /无参数构造器 public ClockTest() ClockPaint cp = new ClockPaint(150, 150, 90); this.add(cp); this.setSize(500, 500); this.setResizable(false); this.setLocation(200, 300); this.setTitle(小时钟); this.setVisible(true); addWindowListener(new WindowAdap
23、ter() public void windowClosing(WindowEvent e) System.exit(0); ); public static void main(String s) new ClockTest(); /表盘类,继承于JPanel,并实现Runnable接口,用于多线程class ClockPaint extends JPanel implements Runnable private static final long serialVersionUID = 1L; private static final Graphics g2d = null; int x,
24、 y, r; int h, m, s;/ 小时,分钟,秒 double rad = Math.PI / 180;/构造器,初始化 public ClockPaint(int x, int y, int r) this.x = x;/坐标x this.y = y;/坐标y this.r = r;/表盘的半径 Calendar now = new GregorianCalendar(); s = now.get(Calendar.SECOND) * 6;/ 获得秒转换成度数 m = now.get(Calendar.MINUTE) * 6;/ 获得分钟 h = (now.get(Calendar.
25、HOUR_OF_DAY) - 12) * 30 + now.get(Calendar.MINUTE) / 12 * 6;/ 获得小时 Thread t = new Thread(this);/创建一个线程 t.start();/表开始走动 /画表盘 public void paint(Graphics g) / 清屏 super.paint(g); g.setColor(Color.BLACK);/用黑色 g.fillRect(0, 0, r * 8, r * 8);/填充一个黑色的矩形做为背景 / 画圆 g.setColor(Color.BLACK);/用黑色 g.drawOval(x, y
26、, r * 7, r * 7);/画出表盘的轮廓 / 用红色画秒针 g.setColor(Color.RED); int x1 = (int) (r - 10) * Math.sin(rad * s); int y1 = (int) (r - 10) * Math.cos(rad * s); g.drawLine(x + r, y + r, x + r + x1, y + r - y1); / 用蓝色画分针 g.setColor(Color.BLUE); x1 = (int) (r - r / 2.5) * Math.sin(rad * m); y1 = (int) (r - r / 2.5)
27、 * Math.cos(rad * m); g.drawLine(x + r, y + r, x + r + x1, y + r - y1); / 用青色画时针 g.setColor(Color.CYAN); x1 = (int) (r - r / 1.5) * Math.sin(rad * h); y1 = (int) (r - r / 1.5) * Math.cos(rad * h); g.drawLine(x + r, y + r, x + r + x1, y + r - y1); / 用黄色画表盘上的数字 g.setColor(Color.YELLOW); int d = 29; fo
28、r (int i = 1; i = 12; i+) x1 = (int) (r - 10) * Math.sin(rad * d); y1 = (int) (r - 10) * Math.cos(rad * d); g.drawString(i + , x + r + x1 - 4, x + r - y1 + 5); d += 30; / 画小点,表示刻度 d = 0; for (int i = 0; i 60; i+) x1 = (int) (r - 2) * Math.sin(rad * d); y1 = (int) (r - 2) * Math.cos(rad * d); g.drawS
29、tring(., x + r + x1 - 1, x + r - y1 + 1); d += 6; / 获得时间、星期、日期 Calendar now1 = new GregorianCalendar();/获得当前的日期时间对象 int hour = now1.get(Calendar.HOUR_OF_DAY);/小时,获得当前的时刻 int minute = now1.get(Calendar.MINUTE);/分,同上 int second = now1.get(Calendar.SECOND);/秒 int year = now1.get(Calendar.YEAR);/年 int month = now1.get(Calendar.MONTH)+1;/月 int date = now1.get(Calendar.DAY_OF_MONTH);/日 int week = now1.get(Calendar.DAY_OF_WEEK);/星期 System.out.println(week); /星期转换字符串 String weekDay = ; switch(-week) case
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1