《模拟时钟课程设计报告(共14页).doc》由会员分享,可在线阅读,更多相关《模拟时钟课程设计报告(共14页).doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上课程设计报告课程: 面向对象程序设计 学号: 姓名: 张扬 李佳珂 金正行 班级: 12计科2班 教师: 钱 田 芬 时间: 2014年12月10日 计算机科学与技术系设计名称:模拟时钟日期:2014年1 2月 10日设计内容:通过多线程技术,重绘界面,绘制一个虚拟的时钟,时钟界面包括表盘和指针。并用数字表显示当前的时间。1 设计目的与要求1.1基本要求编写一个模拟时钟程序,此程序在屏幕中间有一指针式钟面。左上角以数字方式显示时间,该时间应与指针显示的时间一致,且与机器系统时间相同。在设计的过程中,需要用到awt组件和Swing容器与组件,布局管理器,事件处理,绘制图
2、形,还运用到了类的继承,事件监听器和线程。掌握JDK、Editplus、Eclipse、JCreator等开发工具的运用,拓宽常用类库的应用。增进Java语言编辑基本功,1.2 设计目的设计一个带有指针、数字时钟,并且具有秒表功能,能方便我们的使用和操作,为我们以后的使用创造一个良好的平台。把自己所学的理论知识运用到实际操作中去,以此来发现自己的不足,及时的改正。在实际的操作中学习及运用还没有学过的知识。最后在调试与测试的过程还可以提升自己的改错能力也是自己经验的积累!2 设计环境、思想和功能描述2.1运行环境:Eclipse+JDK平台CPU:Pentium2.8GHz以上内存:256MB以
3、上硬盘空间:80G以上操作系统:WindowsXP Windows7 Windows82.2主要设计思想:先是利用构造函数创建一个长为200,宽为200的窗体,颜色设置为black,并把窗体设计为固定大小。利用AWT绘制图形的方法,在窗体中间画一个圆,并且绘制时钟上的12个数字,然后利用Calendar类提供的HOUR,MINUTE和SECOND 方法获得现在的时间,在计算时间和度数的关系;在利用AWT绘制图形的方法绘制出各指针,并设置不同的颜色。在利用drawString在窗体的左上角显示出当前的时间。2.3功能描述:设计的时钟界面良好,比较简洁美观,程序有很强的实用性,实现程序与电脑的时间
4、的同步。可以显示时钟,可以显示具体的数字时间,也可以显示分针秒针。3 设计方案的具体论证3.1详细设计3.1.1 界面及布局设计先是利用构造函数创建一个长为200,宽为200的窗体,颜色设置为black,并把窗体设计为固定大小。利用AWT绘制图形的方法,在窗体中间画一个圆,并且绘制时钟上的12个数字,然后利用Calendar类提供的HOUR,MINUTE,SECOND方法获得现在的时间,在计算时间和度数的关系;在利用AWT绘制图形的方法绘制出各指针,并设置不同的颜色。3.1.2 类、方法类名:Clock作用:自定义主类,对鼠标拖拽的初始界面进行声明类名:ClockPain作用:用来画时钟和指针
5、继承的父类:JComponent类实现的接口:没有表 1-成员变量ClockPaint成员变量成员变量描述变量类型名称时针StringH分针StringM秒针StringS表 2-方法表ClockPaint方法方法名功能备注get(Calendar.SECOND)获得秒数接口方法get(Calendar.MINUTE)获得分钟接口方法get(Calendar.HOUR_OF_DAY)获得小时接口方法Paint()画图Run()运行程序3.2 概要设计启动时钟创建一个主窗体利用AWT绘制图形方法在窗体绘制一个圆,并绘制好12个数字计算出时间和度数的关系绘制出各指针关闭时钟时针走时分针走时秒针走时
6、程序流程图定义子类:ClockPaint继承的父类名:JPanel继承的接口名:Runnableinth,m,s/小时,分钟,秒主要成员方法:s=now.get(Calendar.SECOND)*6/获得秒转换成度数m=now.get(Calendar.MINUTE)*6/获得分钟h=(now.get(Calendar.HOUR_OF_DAY)-12)*30+now.get(Calendar.MINUTE)/12*6/获得小时主要成员方法:/清屏super.paint(g)g.setColor(Color.BLACK)g.fillRect(0,0,r*3,r*3)/画圆g.setColor(C
7、olor.WHITE)g.drawOval(x,y,r*2,r*2)/秒针g.setColor(Color.RED)intx1=(int)(r-10)*Math.sin(rad*s)inty1=(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-y1)/时针g.setColor(Color
8、.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)intd=29for(inti=1;i=12;i+)3.3 程序说明先是利用构造函数创建一个长为200,宽为200的窗体,颜色设置为black,并把窗体设计为固定大小。利用AWT绘制图形的方法,在窗体中间画一个圆,并且绘制时钟上的12个数字,然后利用Calendar类提供的HOUR,MINUTE,SECOND方法获得现在的时间,在计算
9、时间和度数的关系;在利用AWT绘制图形的方法绘制出各指针,并设置不同的颜色。在利用drawString在窗体的左上方画出和时钟相对数字时间。在设计的过程中,需要用到Swing组件和Swing容器与组件,布局管理器,事件处理,绘制图形,还运用到了类的继承,事件监听器和线程。 “GregorianCalendar()”用于显示当前时间;“setColor”用于显示时针、分针和表盘的颜色;“ColornumberColor”用于显示秒针和数字的颜色, “drawOval(x, y, r * 2, r * 2)”用Graphics算法来画圆,其中(x,y)是圆的中心,r为圆半径;“publicvoid
10、paint(Graphicsg)”用于运行时程序;“publicvoidstart()”threat的启动方法; “publicvoidrun()”线程的run方法。run()方法就是分出去让程序同时运行的、用来处理休眠和重画图形的线程。4 设计结果与分析4.1设计结果当程序正常运行的时候,它能清晰的显示时钟界面。默认为与系统时间同步,如果出现错误,就会进行归零。运行界面如图4.2设计分析使用的方法:在Clock的源代码的编写过程中运用了paint()、repaint()、run()等方法。时钟的绘制采用双缓冲图形处理机制,即先在缓冲区内绘制图形,再把图形显示到框架上。时钟的不断绘制是通过一个
11、线程不断读取系统时间,如果时间有变化即绘制。调试方法:首先我是一个类一个类的完成,在每一个类完成后都会对它进行编译,待它能正常的编译之后在进行下面的类的编写。在编译的过程中会有一些错误,比如说语法错误,类的引用格式不正确,会产生一些异常。但是在经过慢慢的调试,这些问题逐渐得到解决遇到的问题和解决方法:在用JAVA编写程序时,我遇到了很多困难,对很多的接口,类,方法都不是很熟悉,只好采用查看API文档,一个一个进行对照学习,同时也上网查看了有关模拟时钟的相关描述,还向同学请教了,翻阅了相关的书籍。专心-专注-专业附录:程序代码import java.awt.Color;import java.a
12、wt.Graphics;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.text.DateFormat;import java.util.Calendar;import java.util.GregorianCalendar;import javax.swing.JFrame;import javax.swing.JPanel;public class Clock extends JFrame private static final long serialVersionUID
13、= 1L; public Clock (int r) ClockPaint cp = new ClockPaint (r); this.add(cp); this.setSize(300,210); this.setResizable(false); this.setLocation(260, 120); this.setTitle(小时钟); this.setVisible(true); addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); publi
14、c static void main(String s) new Clock (70); class ClockPaint1 extends JPanel implements Runnable private static final long serialVersionUID = 1L; int x, y, r; /上边距,左边距,钟面半径 int h, m, s; / 时针,分针,秒针对应的度数 double rad = Math.PI / 180; /角度1所对应的弧度 public ClockPaint1(int r) this.x = r/3; this.y = r/3; this
15、.r = r; Calendar now = new GregorianCalendar(); s = now.get(Calendar.SECOND) * 6;/ m = now.get(Calendar.MINUTE) * 6;/ h = (now.get(Calendar.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.setColo
16、r(Color.black); g.fillRect(0, 0, 300, r*3);/填充矩形,参数分别为左上角顶点横、纵坐标,宽、高 / 画圆 g.setColor(Color.WHITE); g.drawOval(x, y, r * 2, r * 2);/参数分别为矩形的左上角顶点横、纵坐标,矩形宽,矩形高(矩形内切椭圆) / 秒针 g.setColor(Color.RED); int x1 = (int) (r - 10) * Math.sin(rad * s);/r-10为秒针的长度,x轴朝右,y轴朝下 int y1 = (int) (r - 10) * Math.cos(rad *
17、 s); g.drawLine(x + r, y + r, x + r + x1, y + r - y1);/画直线, 前2参数表起点坐标,后2参数表终点坐标 / 分针 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 - y1); / 时针 g.setColor(Color.CYAN); x1 = (int) (r - r /
18、 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); / 数字 int d = 30;/时钟刻度数从1开始,角度的基线是“00”秒时的秒钟,刻度1的夹角为30 for (int i = 1; i = 12; i+) x1 = (int) (r - 10) * Math.sin(rad * d);/刻度数横坐标 y1 = (int) (r - 10) * Math.cos(rad * d);/刻度数纵坐标
19、(rad * d):表示的是弧度 g.drawString(i + , x + r + x1 - 4 , x + r - y1 + 5 ); d += 30; / 小点 d = 0; for (int i = 0; i 60; i+) /循环绘出60个刻度点 x1 = (int) (r - 2) * Math.sin(rad * d);/刻度点横坐标 (r - 2):距圆面向内缩进2像素画点; y1 = (int) (r - 2) * Math.cos(rad * d);/刻度点纵坐标 (rad * d):表示的是弧度 g.drawString(., x + r + x1 - 1 , x +
20、r - y1 + 1);/后2个参数表示横纵坐标,即从该坐标处画“.” d += 6; /一个圆360度,每隔6度画一个点,共60个点 / 显示时间 Calendar now1 = new GregorianCalendar(); int hour = now1.get(Calendar.HOUR_OF_DAY);/小时,获得当前的时刻 int minute = now1.get(Calendar.MINUTE);/分,同上 int second = now1.get(Calendar.SECOND);/秒 g.setColor(Color.pink); g.drawString(hour10
21、?0:)+hour+ : + (minute10?0:)+minute+ : + (second10?0:)+second, 200, 85);/drawString使用当前画笔的颜色和字体,将参数str的内容显示出来,并且最 /左边的字符的基线从坐标x,y开始 Calendar now2 = new GregorianCalendar(); DateFormat f=DateFormat.getDateInstance(DateFormat.FULL);/获取当前日期的完整格式 g.setColor(Color.pink); g.drawString(f.format(now2.getTim
22、e(), 162, 130); /实现接口Runnable的方法run,用来刷新时分秒三指针的度数 public void run() while (true) try Thread.sleep(1000);/休眠一秒 catch (Exception ex) s += 6; if(s % 360=0) m += 6; if(m % 72=0) h += 6; this.repaint(); 设计建议与体会首先,java作为一种计算机语言,它具备语言的特性,就是我们在课堂上认真听取了老师的指导之后,还得自己回去认真看书写程序,并且上机实习才能发现问题及时解决问题。就像我们学习语言一样要通过和同
23、学之间的交流才能提高我们的实际应用能力。所以,我们在自己认真刻苦学习的同时,一定要多和同学老师交流,从他们那里吸取好的思维方式、好的学习方法。对于课程设计,基本上实现了模拟时钟程序的要求,指针式钟面,左上角有数字时间,与系统显示的时间一致。该设计的特点是时钟上标有12数字个刻度,且每一分钟的位置都一个刻度,并且各指针是不同的颜色,看上去比较美观,在左上方显示数字时间,这是为了能更好的看时间。但是功能还不完善,没有实现对于时间的重置。我想在不断地进行对该设计的完善,不仅能为该时钟设置背景,以增加该时钟的美观效果,也可以对时钟到了一定的时间就可以报时,并且可以设置闹钟,为闹钟设置多种音乐,可供选择
24、,这样的话就不显得单调,这样一来该时钟更方便实用。也能对自己的动手能力有所提高。在完成课程设计的过程中,遇到了不少的问题:一是有一些东西自己没有学过;二是在编写的过程中由于思路不清晰以及自己的粗心给自己制造了一些麻烦,还有就是会产生一些异常。但是在经过自己和搭档、同学的交流,以及自己查阅资料和API文档,针对性的对不懂得问题进行查询,自己没有学过但是又要用到得逐渐的得到解决,再经过自己反复的理清思路和反复的检查,由思路不清晰和粗心带来的麻烦也慢慢得到了解决。最后Java作为一个面向对象的编程语言,在图像方面具有很强的实现能力。这样很能激发我的学习兴趣。在编写程序的时候发现,虽然它是一个面向对象
25、的编程语言,我们一定要学会如何编写多个类和方法,在不断地摸索中培养我们自身设计面向对象解决方案的能力。作为学生的我们,是一个学习的过程,我们应该学习如何写好程序。而好的程序不仅仅是一系列语句的拼凑,我们要联系自身实际,用编程语言解决问题和实施解决问题的方案。在以后的日子里,我要不断地学习这个博大精深的语言,继续不断的深化自己的实际动手能力。金 正 行面向对象课程设计这两周来,通过对所选题目程序的详细分析和更改,受益匪浅。让我了解到了Java更多的实用功能,也了解到了自己学习结合实践的不足。实用的软件理论,技术与方法才是我们学习的最终目的,应该有更多的时间花在实践环节,也希望学校以后能安排更多的
26、实验性课程,不至于让理论成为白字,为以后的工作打好基础。 在这次课程设计中,我学到了很多的知识,在对Java的学习上是我学会了怎么将学到的理论知识用到实践中去,改变了过去的学习方法和学习态度,找到了一门自己很喜欢的学科。 题目虽然简单,但是我做的却很艰难,并且功能还不完善,很显然是基础不牢以及缺少动手能力导致的,但最终做出来的那一刻我还是很高兴的。由此我觉得学习语言不能只看书,一定要多动手去操作,在操作过程中发现问题,解决问题,才能提高自己的能力。 对于同一个问题只要多试几次,多思考就会找到更好的解决办法,就本次课程设计而言,在最后的运行代码段里的分针,时针转动的解决办法也是算了很多次,我才找
27、到我认为最好的办法。一个好的程序,必须模块清晰,代码简单易懂,(而这就取决于你解决问题的角度)这是我最深的感触。 在这次课程设计中本课程设计并非由我一个人来完成,我深深的感受到了一个团队力量的强大,了解到了在完成一个完整的项目上团队的重要性,在实际的程序开发中,团队的力量往往比个人力量之和要大上很多,并且在今后的开发中,我们都将是以团队的形式展开工作的,所以我们应该在现在学习的时候养成一种良好的团队精神,以为将来的开发打下一顶的基础。 李 佳 珂 在学JAVA这门学科时,我开始还以为它跟C差不多的,但随得学习的深入就弄明白了这两者的关系有得很大的差别,在写程序上就能看出来这其中的差别的不同处。
28、在课程设计中,我开始还没怎么在意的,以为不过是件小事,能很快的搞定,但随的越来越深入的设计才明白我的想法是多么的可笑,在做程序写个代码就不是那么容易的事,还有好多的页面设计都需要用到不同的知识点这其中的不少问题都需要在课本中才能找出来进行解决,这也给我带来了许多的困难。在这部分设计中,我开始时也不知道打从何处开始的,但从以前的那个C的课程设计中知道,一般的程序设计都是从代码开始的,在代码的基础上再来修做剩下的桌面设计部分。在写代码中,对我来说这是种相当沉重的压力的,因为我的英语不好而导致我在许多的语句都不知道怎么写,好多的内容都需要查找书本才来写出来,这给写作代码带来了极大的困难,浪费了好多的时间来写代码。这也是这么多天来的付出的努力吧,在这样的付出终得到了个好的结果。同时也有点遗憾,在整个设计中,我没自己单独的完成整个任务,这也是自己要认真反思的地方。 张 扬设计成绩:教师签名:年月日