java模拟时钟课设.docx
《java模拟时钟课设.docx》由会员分享,可在线阅读,更多相关《java模拟时钟课设.docx(23页珍藏版)》请在冰点文库上搜索。
java模拟时钟课设
JAVA模拟时钟课设
1.课程设计的目的
Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。
面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。
为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了一周的Java程序设计课程设计。
通过此次课程设计,巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、Editplus、Eclipse、JCreator等开发工具的运用,拓宽常用类库的应用。
使学生通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。
2.设计方案论证
2.1运行环境:
JCreator+JDK平台
CPU:
Pentium2.8GHz以上
内存:
256MB以上
硬盘空间:
80G以上
操作系统:
WindowsXP
2.2设计思路及功能描述
Java是一种简单的,面向对象的,分布式的,解释的,键壮的,安全的,结构中立的,可移植的,性能很优异的,多线程的,动态的语言。
Java去掉了C++语言的许多功能,让Java的语言功能很精炼,并增加了一些很有用的功能,如自动收集碎片。
这将减少平常出错的50%。
而且,Java很小,整个解释器只需215K的RAM。
因此运用Java程序编写模拟时钟程序,实现简单显示时间的功能。
本次课程设计做的是Java简单模拟时钟,它是图形界面、线程、流与文件等技术的综合应用,其界面主要采用了java.awt包,javax.swing包等。
程序实现了模拟时钟的基本功能。
我设计的时钟有的界面良好,比较简洁美观,程序有很强的实用性,实现程序与电脑的时间的同步。
可以显示时钟,也可以显示分针秒针,并可以在相应位置调整时间。
而且初始运行会自动与电脑的时间校对,一般默认为同步,但还可以自己再次调节,提高了实用性。
本系统共包括1个java源文件。
Clock源文件是本程序的主函数其作用是初始化棋盘。
setCurrentTime源文件实现电脑设置时间。
paintHourPointer源文件为时针.paintSecondPointer源文件实现人与电脑设置秒针.paintMinuteDot源文件人与电脑设置分针。
2.3方案论证
2.3.1详细设计
类名:
Clock
作用:
自定义主类,对鼠标拖拽的初始界面进行声明
继承的父类:
JComponent类
实现的接口:
没有
表1-成员变量表
Clock成员变量
成员变量描述
变量类型
名称
时针
String
Hour
分针
String
Minute
秒针
String
Second
时间点
TextField
text_1
表2-方法表
Clock方法
方法名
功能
备注
setCurrentTime
设置当前时间
构造方法
paintHourPointer
设置时针
接口方法
paintSecondPointer
设置秒针
接口方法
paintMinuteDot
设置分针
接口方法
actionPerformed
事件处理
run
程序运行
2.3.2概要设计
图1程序基本框图
程序中引入的包:
packageClock
importjava.awt.Clock
importjava.awt.Graphics
importjava.awt.event.WindowAdapter
importjava.awt.event.WindowEvent
importjava.util.Calendar
importjava.util.GregorianCalendar
用户自定义类:
类名:
Clock
作用:
定义模拟时钟
继承的父类:
JFrame
publicclassclockextendsJFrame{
定义的对象:
ClockPaint
size
Resizable
Location
Title
Visible
WindowListener,WindowClosing
主要成员方法:
publicvoidcenter//定义小程序查看器的位置
publicvoidactionPerformed//定义处理异常机制
定义子类:
ClockPaint
继承的父类名:
JPanel
继承的接口名:
Runnable
classClockPaintextendsJPanelimplementsRunnable
inth,m,s//小时,分钟,秒
主要成员方法:
publicClockPaint
this.x=x
this.y=y
this.r=r
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//获得小时
主要成员方法:
publicvoidpaint(Graphicsg)//清屏
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)
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.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=29
for(inti=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(inti=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//显示时间
//Calendarnow1=newGregorianCalendar();
//g.drawString(now1.get(Calendar.HOUR_OF_DAY)+":
"
//+now1.get(Calendar.MINUTE)+":
"+now1.get(Calendar.SECOND),
//0,10);
主要成员方法:
publicvoidrun
捕获异常
catch(Exceptionex)
完成显示实时数据
s+=6
if(s>=360)
s=0
m+=6
if(m==72||m==144||m==216||m==288)
h+=6
if(m>=360)
m=0
h+=6;
if(h>=360)
h=0;
this.repaint();
用Java实现动画的原理与放映动画片类似,就是取若干个相关的图像或图片,顺序、连续地在屏幕上先显示、后擦除,循环往复就可以获得动画的效果。
在动画设计中,一般会用到paing()、repaint()、和update()方法。
在动画设计中,有时会存在抖动问题,但一般来说,浏览器能很好地解决显示和刷新问题。
在图形设计中,若重写paint()方法可以自动绘制所希望的图形,在需要更新图形时可调用repaint()方法,而不需要重写repaint()方法。
至于update()方法,一般情况下既不需要重写,也不需要调用。
只是在动画设计中,如果仅重写paint()方法,会产生抖动现象,为消除抖动现象,需要重写update()方法。
在主页中经常会看到卡通似的动画效果,制作这种动画的原理也是很简单的,就是通过快速地放映许多张图片,利用人眼的视觉暂留特性来达到动画的效果。
动画的质量除了取决于图片的好坏之外,动画中动画的平滑速度,也是非常关键的。
2.4程序说明
先是利用构造函数创建一个长为500,宽为200的窗体,颜色设置为black,并把窗体设计为固定大小,并且创建一个监听事件进行监听。
随即创建一个时间计数器,最后实现ActionListener接口的实现方法。
利用2D绘制图形的方法,在窗体左方画一个圆,并且绘制时钟上的12个汉字,然后利用Calendar类提供的HOUR,MINUTE,SECOND和MILLISECOND方法获得现在的时间,在计算时间和度数的关系;在利用2D绘制图形的方法绘制出各指针,并设置不同的颜色。
在利用drawString在窗体的右上方画出一个小的框并在里面现在和时钟相对数字时间;然后根据相同的方法在数字时间下面显示秒表功能。
在设计的过程中,需要用到Swing组件和Swing容器与组件,布局管理器,事件处理,绘制图形,还运用到了类的继承,事件监听器和线程。
“SimpleDateFormatformatter”用于格式化时间显示,“Stringlastdate”用于保存当前时间的字符串,“FontclockFaceFont”用于设置显示时钟里面的数字的字体;“DatecurrentDate”用于显示当前时间;“ColorhandColor”用于显示时针、分针和表盘的颜色;“ColornumberColor”用于显示秒针和数字的颜色,“publicvoidinit()”用于设计时钟格式并捕捉异常;“publicvoidplotpoints(intx0,inty0,intx,inty,Graphicsg)”用于计算四分之一的圆弧;“publicvoidcircle(intx0,inty0,intr,Graphicsg”)用Bresenham算法来画圆,其中(x0,y0)是圆的中心,r为圆半径;“publicvoidpaint(Graphicsg)”用于运行时钟程序;“publicvoidstart()”applet的启动方法;“publicvoidstop()”applet的停止方法;“publicvoidrun()”线程的run方法。
run()方法就是分出去让程序同时运行的、用来处理休眠和重画图形的线程。
3.设计结果与分析
3.1设计结果
当程序正常运行的时候,它能清晰的显示时钟界面。
默认为与系统时间同步,如果出现错误,就会进行归零。
运行界面如图
图2运行界面
3.2设计分析
本程序可以在HTML文件中设置,变化出多姿多彩的时钟模型,在MyClock.class的源代码的编写过程中运用了paint()、repaint()、update()等方法。
时钟的绘制采用双缓冲图形处理机制,即先在缓冲区内绘制图形,再把图形显示到网页上可以有效的防止闪烁。
时钟的不断绘制是通过一个线程不断读取系统时间,如果时间有变化即绘制。
采用一个线程绘制。
遇到的问题和解决方法:
在用JAVA编写程序时,我遇到了很多困难,对很多的接口,类,方法都不是很熟悉,只好采用查看API文档,一个一个进行对照学习,同时也上网查看了有关模拟时钟的相关描述,还向同学请教了,翻阅了相关的书籍。
程序异常处理:
程序在运行过程中可能会出现错误且断正常的控制流,这就是异常处理。
不提供处理异常代码的程序可能会在不期望终止的时候终止,甚至可能引发严重问题。
Java的异常处理子系统可以为程序员提供处理运行是错误即异常处理的能力,而且比其他语言提供的异常处理能力在形式上更简洁、更灵活,使用Java的异常处理子系统,程序员可以开发出比较健壮的程序。
声明异常:
声明异常是当方法执行时,声明方法中可能出现的错误。
因为任何代码都可能出现系统错误和运行错误,所以Java不需要在方法中显示声明Error和RuntimeException,但是如果方法抛出其它异常,则必须在方法中显示声明它们。
可以使用方法声明中的关键字throws声明方法中的异常。
PublicvoidmyMethod()throwsIOException
抛出异常:
在声明异常的方法中,如果出现异常,可以抛出异常对象。
声明异常是一个说明性的句子,只是表明方法可能会抛出异常,而真正抛出异常的动作是有抛出异常语句来完成的。
抛出异常的语句如下:
ThrownewTheException();
也可以使用以下的语句:
TheExceptione=newTheException();
Throwe;
使用try-catch语句捕获异常
在Java中,异常处理的核心语句是try和catch。
虽然由JVM提供的默认异常处理程序对于我们调试程序很有帮助,但是通常我们希望自己处理异常,因为可以防止程序非正常终止,并可以有机会改正程序中的错误。
Try-catch语句的语法形式为:
try{
blockofcodetomonitorforerrors
}
catch(ExceptionTypelObj1){
handlerforExcepType1
}
catch(ExceptionType2Obj2){
handlerforExcepType2
}
4.设计体会
本次Java课程设计我的题目是时钟,题目不算难,但我做的很艰苦。
主要就是动手能力太差,理论知识掌握的不全面,自以为会不少,但真做起来,却不知道从哪下手了。
又回去温习理论知识,请教老师,上网查资料,忙的不亦乐乎。
不过经过努力总算是做出来了,还通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用。
在设计的过程中我遇到的很多问题,在老师的帮助和自己的思考下还是很好的完成了。
这此课程设计我懂得了写程序不能脱离实际,只凭主观办事,要努力拓宽知识面,拓展思维。
事情就是如此,努力代表收获。
通过这次课程设计,我才真正领悟到“艰苦奋斗”这一词的真正含义,我才感受到早期电子设计者为现代的社会付出。
设计确实有些辛苦,但苦中也有乐,在如今单一的理论学习中,很少有机会能有实践的机会,但现在可以,这些天的设计中得到的东西却不比理论课上得到的少多少,我感觉我和Java的距离更加近了;我想说,确实很累,但当我看到自己所做的成果时,心中也不免产生兴奋;学习有成果了么。
对Java编程有了一个基本的了解。
这些天温习的内容越多,敲得代码越多,自己的学习积极性也越在提高,感觉也越充实。
越来越发现现在学习的只是Java的基础,但涉及的面还是很广泛的,这些都为以后进一步学习Java的高级特性打下了扎实的基础。
随着课程难度的慢慢加强,今后遇到的困难也必将会越来越多,但我相信自己一定能做好这些的。
在本次Java课程设计中,我要非常感谢我的指导老师,不但在课堂上教给了我很多的Java的编程知识,编程思想,而且在这次课程设计中更教会了我动手的能力,真正的编出了自己的东西,还要感谢我的同学,他们在我遇到困难时也给了我很多帮助。
感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把设计做得更加完善。
在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。
最后,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计上的难题。
同时也感谢学院为我提供良好的做课程设计的环境。
最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学。
5.参考文献
[1]《Java语言与面向对象程序设计》[M].朱福喜、尹为民、余振坤编著,武汉:
武汉大学出版社,2009.3
[2]《Java语言与面向对象程序设计》[M].印旻编著,北京:
清华大学出版社,2010.6
[3]《Java程序设计实用教程》[M].朱站立、沈伟编著,北京:
电子工业出版社,2008.9
[4]孙一林、彭波、黄文宏.Java编程技术全接触[M].北京:
清华大学出版社,2009.3
[5]丁振凡、薛清华.Java语言程序设计[M].北京:
清华大学出版社,2010.10
[6]徐林林.JavaWeb编程从入门到实践[M].北京:
清华大学出版社,2010.3
[7]赵振方、陈景霞.轻松学Java编程[M].化学工业出版社,2012.4
6.附表
publicvoidsetCurrentTimeAsSystemTime(){
//定义Date类的一个对象,用来获取系统时间
DatetimeCurrent=newDate();
catch(InterruptedExceptione){}}}
importjava.awt.*;
importjava.awt.geom.Ellipse2D;
importjava.awt.geom.GeneralPath;
importjava.awt.geom.Line2D;
importjava.awt.geom.Rectangle2D;
importjava.util.Calendar;
importjava.util.Date;
importjavax.swing.BorderFactory;
importjavax.swing.JComponent;
importjavax.swing.JFrame;
importjavax.swing.UIManager;
publicclassClockextendsJComponent
{
privatestaticfinalColorINTEGRAL_COLOR=newColor(0,128,128);
privateintradius;
privateCalendarcurrentTime=Calendar.getInstance();
privatedoubles=0.03;
publicClock(intradius)
{
this.radius=radius;
}
publicvoidsetCurrentTime(Datetime)//设置当前时间
{
this.currentTime.setTime(time);
}
publicvoidsetCurrentTime(longmillis)
{
this.currentTime.setTimeInMillis(millis);
}
publicDimensiongetPreferredSize()
{
Insetsinsets=getInsets();
intr=(int)(radius==-1?
0:
radius*(1+s))+1;
returnnewDimension(r*2+insets.left+insets.right,r*2+insets.top+insets.bottom);//返回一个指定宽、高的Dimension
}
protectedvoidpaintComponent(Graphicsg)
{
super.paintComponent(g);
Graphics2Dg2d=(Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Insetsinsets=getInsets();
intwid=getWidth()-insets.left-insets.right;
inthei=getHeight()-insets.top-insets.bottom;
intr=(int)((Math.min(wid,hei))/2/(1+s));
g2d.translate(insets.left+r*(1+s),insets.top+r*(1+s));
g2d.scale(1,-1);
for(inti=0;i<60;i++){
intangle=90-i*6;
doublepos[]=calcPos(r,angle);
paintMinuteDot(r,g2d,pos[0],pos[1],i%5==0);
}
paintHourPointer(r,g2d);
paintMinutePointer(r,g2d);
paintSecondPointer(r,g2d);
paintCenterPoint(g2d);
g2d.scale(1,-1);
g2d.translate(-insets.left-r*(1+s),-insets.top-r*(1+s));
}
privatevoidpaintCenterPoint(Graphics2Dg2d)
{
g2d.setColor(Color.BLUE);
Rectangle2Drect=newRectangle2D.Double(-2,-2,4,4);
g2d.fill(rect);