JAVA课程设计--模拟时钟.docx

上传人:李司机 文档编号:6722191 上传时间:2024-01-10 格式:DOCX 页数:17 大小:94.32KB
返回 下载 相关 举报
JAVA课程设计--模拟时钟.docx_第1页
第1页 / 共17页
JAVA课程设计--模拟时钟.docx_第2页
第2页 / 共17页
JAVA课程设计--模拟时钟.docx_第3页
第3页 / 共17页
JAVA课程设计--模拟时钟.docx_第4页
第4页 / 共17页
JAVA课程设计--模拟时钟.docx_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《JAVA课程设计--模拟时钟.docx》由会员分享,可在线阅读,更多相关《JAVA课程设计--模拟时钟.docx(17页珍藏版)》请在三一办公上搜索。

1、第1章课题概述11.1 课题的目的11.2 课题的要求11. 2.1图形的绘制11.1 2.2多线程技术1第2章概要设计21.2 整个程序的模块结构及流程21.3 窗口的绘制21.4 图形绘制与刷新32. 3.1图形绘制32. 3.2图形刷新32.4钟面绘制32.4.1GraphicsGraphics2D32.4.2坐标32.5 指针的绘制32.6 获取时间42.7 多线程的运用42.7.1线程创建42.7.2线程运行42.8屏幕闪动问题5第3章程序功能的实现63.1 主函数的实现63.2 主要功能模块的实现63.2.1窗口的实现63.2.2图形绘制的实现63.2.3绘画钟盘的实现63.2.4

2、绘画指针的实现83.2.5获取、输出时间,数字表的实现83.2.6多线程的实现93.2.7解决屏幕闪动的实现9第4章调试及发现问题的解决H第5章程序测试及分析12第6章总结1315参考文献第1章课题概述本次JAVA课程设计的题目是设计并实现模拟时钟,时钟的界面包括表盘和指针并用数字表显示时间。1.1 课题的目的随着经济全球化地不断发展,人们对于时间概念越来越重视。时钟是人们把握时间最直接的工具。为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练应用面向对象的思想和设计方法解决实际问题的能力,巩固所学JaVa语言基本知识,增进JaVa语言编辑基本功,掌握JD

3、K、ECliPSe等开发工具的运用,掌握了JaVa中的SwirIg组件、graphics方法及多线程技术的应用,拓宽常用类库的应用。将所学的理论知识运用到实际操作中去,以此来发现不足,及时的改正。在实际的操作中学习及运用还没有学过的知识,提高学习能力与运用能力。在调试与测试的过程还可以提升改错能力,同时也是经验的积累。1.2 课题的要求本次课程设计做的是JaVa模拟时钟。通过图形界面、线程等技术的综合应用,实现模拟时钟的基本功能。1.3 .1图形的绘制(1)所绘图形的界面包括表盘和指针。(2)用数字表显示时间(3)所绘时钟应整齐、清晰,以便用户能够一眼准确得知当前时间。1.2. 2多线程技术(

4、1)要求时钟与数字表是动态的效果。(2)要求时钟与数字表每秒刷新一次。第2章概要设计1.1 整个程序的模块结构及流程根据课题要求,整个程序按功能可划分为界面、钟面绘制、时针绘制和线程这四个主要模块。程序各功能模块的划分,及主要流程如图2T所示。图2-1整个程序各功能模块间的流程1.2 窗口的绘制Swing组件是在AWT组件基础上发展起来的新型GUI组件。Swing不但用轻量级组件代替了AWT中的重量级组件,而且Swing组件中增加了一些新特性。所以选用Swing组件。JFrame容器属于顶级容器组件,是JavaApplication的GUI容器。JFrame类包括支持任何通用窗口特型的基本功能

5、。利用JFrame创建一个长为600,宽为600的窗口;将窗口位置定在坐标(450,100)处;把窗体设计为固定大小,并设置单击关闭窗口按钮操作。1.3 图形绘制与刷新2. 3.1图形绘制图形的绘画是通过Paint()方法实现。paint()方法属于Container类,以画布为参数,在画布上执行画图的方法。3. 3.2图形刷新图形显示的刷新通过repaint()方法实现。repaintO方法调用UPdateO方法从而调用PaintO方法,实现刷新。4. 4钟面绘制5. 4.1GraphicsGraphics2DGraPhiCS相当于画笔的作用,通过GraPhiCS画出圆、指针,并且绘制时钟上

6、的12个数字。例如:钟盘是通过graphics中的drawval(intx,inty,intw,inth)方法绘制的圆其实是矩形的内接圆,x、y是正方形左上角的点坐标,w、h为矩形的长和宽。但由于GraPhiCS无法实现修改所画图形的粗细、虚实等一些功能,所以引入GraPhiCS的拓展类GraPhics2D,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在JaVa平台上呈现二维形状、文本和图像的基础类。6. 4.2坐标在java中坐标原点(0,0)位于整个绘画平面的左上角,从原点(0,0)出发向右为X轴,向下为y轴。所有的坐标必须是正整数,不能带有小数,一个单位代表一个

7、像素。计算钟盘数字的“12”、“6”、“3”、“9”所在坐标较为容易,大致位置是画面的长、宽及其一半。具体位置由最终效果决定,例如“12”的位置,需要时针正好指在1和2的中间,所以需要将“12”向左平移。计算钟盘数字“1”、“2”、“4”、“5”、“7”、“8”、“10”、“11”的坐标需要通过几何图形计算。由于数字所在位置具有对称性,所以只需计算“1”、“2”“4”、“5”的坐标,其余坐标较为容易推出。2. 5指针的绘制通过计算度数和坐标的关系得出函数表达式。圆心为指针的起点,函数表达式中的(x,y)为指针的终点,利用graphics中drawLine连接两点画出直线段,并设置不同的颜色、粗

8、细。2.6获取时间通过JDK底层提供的Calendar类中的DAY_OF_WEEK,MONTH,DATE,HOUR_OF_DAY,MINUTE,SECOND,YEAR方法获得当前的时间。CaIencIar中的月份是从0开始计算的,所以获得的月份要加1。Calendar中的星期是从星期天开始,这与我们每个星期从星期一开始有所不同,所以排版时需要把星期天放在首位。2. 7多线程的运用在语言及层面上支持多线程程序设计是Java的一个重要特性。多线程是指一个程序中包含多个执行流,多线程是实现并发的一种有效手段。3. 7.1线程创建线程的创建有两种方法:1 .通过继承Thread类创建线程。2 .通过实

9、现RUIInablC接口创建线程。两种方法相比,虽然运用第一种继承Thread类的方法创建线程的程序代码较为简单,并可以在runO方法中直接调用线程的其他方法。但我更偏爱于通过第二种实现RUnnable接口的方式创建线程。首先,实现RUrmabIC接口的方法不会影响到Thread类的体系,符合面向对象设计的思想。其次,该方法便于继承其他的类,因为一个类只能继承一个类,但可以实现多个接口,适合资源的共享。2. 7.2线程运行线程在创建之后,就开始了它的生命周期。图2-2线程的生命周期runO方法的实现是通过Start()方法的调用。线程调用sleepO方法进入睡眠状态。2.8屏幕闪动问题SWin

10、g方法自带双缓冲是通过Paint()方法实现的,可是因为重写了paintO方法,所以破坏了SWirIg的双缓冲,出现屏幕闪动问题。为解决屏幕闪动问题,引入BufferedImageoBufferedImage是image抽象类的实现,它将图形放入内存缓冲区中,可以实现图片双缓冲。双缓冲就是先在内存中的另一张“画布”上进行多次绘图,然后把画好的图在一次性画到屏幕上从而解决闪屏的问题。第3章程序功能的实现3.1主函数的实现创建一个clock对象,通过clock对象调用ThreaclClock()方法。因为RUrmablC接口只定义了一个run()方法,所以调用Start()和SICeP()方法时,

11、必须创建Thread的实例化对象,并通过线程的startO方法调用runO方法。publicstaticvoidmain(Stringargs)(ThreadClockclock=newThreadClockO;newThread(clock).start();)3. 2主要功能模块的实现3. 2.1窗口的实现创建一个窗口,设置窗口的名字、窗口大小的长宽为600,600、窗口显示位置在坐标(450,100)处。设置单击关闭窗口按钮操作。设置可见性为true。固定窗口的大小。创建窗口代码如下:publicThreadClockOSUPer(数字时钟);设置窗口名字setSizc(600,600)

12、;设置窗口大小SetLocation(450,Io0);设置窗口位置setDefauItcioseOperation(Disposeonclose);setVisible(true);SetResizable(false);)4. 2.2图形绘制的实现图形的绘制是通过paint()方法实现。通过drawImage方法,绘制boardDisplay中的图像。图像的左上角位于该图形上下文坐标空间的(0,0)o图形绘制的代码实现如下:publicvoidpaint(Graphicsg)g.drawlmage(boardDisplay,0,0,null);3.2.3绘画钟盘的实现通过Graphics相

13、当于“画笔”,在画布上画出钟盘的图形。将Graphicsg强制转换为GraPhiCS2D。定义一个StrOke接口的X对象,实现BaSiCStrOke类方法,将所画钟盘轮廓的性质,粗为标准粗细的3倍,轮廓为虚线,赋给X,用X画出所需的钟盘轮廓。用setFontO方法设置字体。计算钟盘、数字的坐标位置,通过drawString()画出钟盘与数字。绘画钟盘的代码实现如下:Graphicsg=boardDraw.getGraphicsO;Graphics2Dg2d=(Graphics2D)g;Strokex;g.SetColor(Color.WHITE);g.ClearRect(0,0,boardD

14、raw.getWidth(),boardDraw.getHeightO);g.fiHRect(0,0,boardDraw.getWidthO,boardDraw.getHeightO);画钟盘g.SetColor(Color.BLACK);x=newBasicStroke(3f,BasicStroke.CAPBUTT,BasicStroke. JOIN_BEVEL, O, new 粗线、虚线 g2d.SetStroke(x);g. draw0val(100, 100, 400, 400);g. setFont(new FOnt(Times”, Font. BOLD, g. SetColor(C

15、olor. RED);画钟盘数字g. drawS tri ng C,12, 287, 130);g. drawString(,6z, 293, 480);g. drawStringC,9z, 125, 310);g. drawStringC,3 470, 310);g. setFont(new Font(Times”, Font. BOLD, g. SetColor(Color. BLUE);float 17, 4 ), 0);设置25);设置字体20);382, 442, 442, 382,211, 151,157);222);390);457);457);390);g.drawString

16、(z,1,g.drawString(2”,g.drawString(z,4zz,g.drawString(5”,g.drawString(7”,g.drawString(8”,g.drawString(z,10,148,222);g.drawString(z,llyz,210,157);g.fiIlOval(295,295,10,10);修饰钟盘g.SetColor(Color.BLACK);g2d.SetStroke(newBasicStroke(2f);g.drawLine(300,110,300,100)g.drawLine(300,490,300,500)g.drawLine(100,

17、300,110,300)g.drawLine(490,300,500,300)3. 2.4绘画指针的实现圆心为指针的起点,函数表达式中的(x,y)为指针的终点,利用graphics中drawLine连接两点画出直线段,并设置不同的颜色、粗细。时针黑色、最粗、最短;分针蓝色、较粗、较长;秒针、红色、最细、最长。绘画时针的代码实现如下:g2d.SetStroke(newBasicStroke(1.5f);g.SetColor(Color.RED);DrawHands(g,second/60.0,180);g2d.SetStroke(newBasicStroke(2.5f);g.SetColor(C

18、olor.BLUE);DrawHands(g,minute/60.0,150);g2d.SetStroke(newBasicStroke(4f);g.SetColor(Color.BLACK);DrawHands(g,(hour)/12.O,120);计算角度与坐标的函数表达式privatevoidDrawHands(Graphicsg,Doublepercent,intlength)doubledegree=360*percent;intx=(int)(300+Math,cos(2*Math.PI*(90-degree)/360)* length);inty=(int)(300-Math,s

19、in(2*Math.PI*(90-degree)/360)* length);g.drawLine(300,300,x,y);画时针)3.2.5获取、输出时间,数字表的实现通过JDK底层提供的Calendar类中的DAY_OF_WEEK,MONTH,DATE,HOUR_OF_DAY,MINUTE,SECOND,YEAR方法获得时间。定义一个String类型的数组WeekName,将星期以数组的形式存入WeekName中,方便星期的输出。定义一个String类型的timeString,存入通过String类中的format方法,对时间输出格式进行的排版。定义数字表显示的位置坐标。获取、输出时间,

20、数字表的代码实现如下:Calendarc=Calendar,getlnstance();intweek=c.get(Calendar.DAYOFWEEK);intmonth=c.get(Calendar.MONTH);intday=c.get(Calendar.DATE);inthour=c.get(Calendar.HOUROFDAY);intminute=c.get(Calendar.MINUTE);intsecond=c.get(Calendar.SECOND);intyear=c.get(Calendar.YEAR);时间输出形式排版StringWeekName=星期日,星期一,星期二

21、,星期三,“星期四,星期五”,星期六);StringtimeString=String,format(%s%s年%d月%d日%02d:%02d:%02d,WeekNameweek,year,month+1,day,hour,minute,second);g.drawString(timeString,150,550);数字表显示位置Strings=北京时间”;g.drawString(s,75,75);3.2.6多线程的实现调用RUrmabIe接口中的run()方法,run()方法的实现是通过Start()方法的调用。调用SIeePO方法进入睡眠状态,因为时针是一秒一动,所以睡眠时间是1000

22、毫秒,也就是1秒。异常处理。多线程的代码实现如下:publicvoidrunOwhile(this.isShowing()this,repaintO;try(Thread.sleep(1000);catch(Exceptione)System,out.println(e);)3.2.7解决屏幕闪动的实现创建两块“画布”,一块用于多次绘画boardDraw,另一块用于显示绘画boardDisplayo先在内存中的一张“画布”上进行多次绘图,然后把画好的图在一次性画到屏幕上从而解决闪屏的问题。解决屏幕闪动的代码实现如下:privateBufferedlmageboardDraw;privateBu

23、fferedlmageboardDisplay;boardDraw=newBufferedImage(this.getWidth(),this.getHeight(),BufferedImage.TYPE_INT_RGB);boardDisplay=newBufferedlmage(this.getWidthO,this.getHeightO,BufferedImage.TYPENLRGB);BufferedImagetmp=boardDisplay;boardDisplay=boardDraw;boardDraw=tmp;第4章调试及发现问题的解决当我编好了一个无语法错误的程序时,以为大功告

24、成,其实不然。程序依旧与想要得到的最终效果有些不同,这些问题是我在编程的过程中所忽视的。1、通过CaIenelar获取的时间与正确时间有所差别。解决方法:通过查找JDK中CaICndar方法,发现CaIendar中的月份是从O开始计算的,所以获得的月份要加1,并且Calendar中的星期是从星期天开始,这与我们每个星期从星期一开始有所不同,所以排版时需要把星期天放在首位。2、通过准确计算获得的坐标所显示出来的钟表中数字的位置与想象中的有所不同,指针并没有指向数字的中心,甚至有些数字有被挤出来的感觉。解决方法:在制作过程中,我忽视了确定数字位置的坐标并不是指数字中心点的坐标位置。所以我根据运行的

25、时钟的指针指向的位置,对数字的位置进行了略微的调整,使指针指向数字中心。3、在程序运行过程中,出现了屏幕闪动的问题。解决方法:我上网查找了解决屏幕闪动问题,发现原本SWing方法是自带双缓冲功能,并且是通过Paint()方法实现的。可是因为我重写了Paint()方法,所以破坏了Swing的双缓冲,出现屏幕闪动问题。为解决屏幕闪动问题,我引入BUfferCdImage。BUffCrCdImage是image抽象类的实现,它将图形放入内存缓冲区中,可以实现图片双缓冲。我创建了两块“画布”,一块用于多次绘画boardDraw,另一块用于显示绘画boardDisplay0先在内存中的一张“画布”上进行

26、多次绘图,然后把画好的图在一次性画到屏幕上从而解决闪屏的问题。4、钟盘的美化,钟盘轮廓线条变粗、变成虚线。解决方法:定义一个StrOke接口的X对象,实现BaSiCStroke类方法,将线条性质自定义为粗是标准粗细的3倍,轮廓为虚线,赋给X,用X画出所需的钟盘轮廓。就像画图工具一样,先选择笔刷的粗细、颜色、样式,再画出所要的图形。第5章程序测试及分析通过主函数中的start()调用run()方法,开始绘制时钟,并通过repaintO刷新Paint(),休眠时间为1秒,这样便产生了指针一秒走动一次的效果。运行程序,便会看到如下的时钟。时间与电脑上的时间一致,钟盘整齐、干净,无屏幕闪动问题。星期一

27、2015年7月5日13:12:09图5-1时钟第6章总结通过一个星期的Java课程设计,不仅使我对Java语言有了更深刻的认识和了解,而且使我其他方面的能力也得到了提高。1、编写程序需要冷静的大脑,心急吃不了热豆腐。一开始拿到模拟时钟这一道题目时,我是亳无头绪的。我不知道怎么画时钟、怎么获取时间、怎么样可以使指针走动等等问题,不知道从何下手。我便拿了一支笔,在纸上画了起来。我最终要得到的是一个时钟,然后就是组成时间的功能,接着就是实现功能的方法,慢慢的,一个程序的框架图便浮现在了纸上,我的大脑也慢慢的冷静下来,对自己要做的程序有了一个初步的框架和计划。有时一笔一纸,可以帮助你整理思路,使自己冷

28、静下来,对程序有一个更好规划。2、基础知识很重要一开始学习JaVa语言的时候,我心里十分烦躁,各种定义名称的要求,intCIOUbIe的转换,循环等等的JaVa基础知识,让我觉得知识点很乱,很难能一下子就可以全部记住、理解、运用,并且当几天不敲代码,就会容易遗忘。那时候觉得没什么,下次用的时候再翻翻书就可以了。但是通过这一次的课程设计,我发现JaVa的程序离不开基本框架、基础知识,那些最基础的知识是必须要牢记于心的,否则你根本想不起来这里是要用到这个知识点,更别说通过翻书的方式来详细查找这个知识点的方式、用法。3、找资料、自学的能力得到提高这次课程设计中,有些知识是教科书上没有的,例如:gra

29、phics,这就需要自学的能力。这次课程设计,大大增加了我查找JDK的能力,并渐渐熟悉了JDK,意识到JDK的重要性。其实有很多我们要实现的功能,JDK已经帮我们实现了,只要调用方法就可以实现。认真阅读、查找JDK中所需要的方法,有些专业术语不懂,或者是依旧没看懂其用法的,我便会上网查找,往往会找到用此方法实现的其他功能。然后我再结合我想要的功能,进行举一反三,一步步推敲、摸索。通过自己的努力、一步步调试而实现的方法,比那些直接从网上复制黏贴的方法,多了一种兴奋感,这应该就是程序员的快乐来源。4、不要放弃,有时换个方法,你会发现不一样的天地在答辩的时候,老师让我将钟盘的轮廓加粗并且变成虚线。我

30、查找了JDK、GraPhiCS中的drawval()方法,发现里面并没有让圆的轮廓变粗、虚线的方法,我便回答老师说我不会。现在想想自己挺幼稚的,也特别感谢老师当时对我说:“我不管你用什么方法,只要实现我要求的功能就行。”这次话使我再一次查找了JDK0在无意间,我发现了GraPhiCS下有一个GraPhics2D的类,点进去就看到了这个类的说明,它是GraPhiCS的拓展类,它可以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。或许Graphics2D可以帮助我实现我要的功能,果不其然,在GraPhics2D这个类中,我发现了getStroke()方法可以定义线条的样式,然后一步步发现了SetStrOke()方法、BasicStroke类以及StrOke接口。原来只要定义一个StrOke接口的X对象,实现BaSiCStroke类方法,将所画钟盘轮廓的性质,粗为标准粗细的3倍,轮廓为虚线,赋给X,用X画出所需的钟盘轮廓就可以实现老师所要求的功能。JaVa语言不只是需要了解掌握课本上的知识,更重要的是实践。通过实践,我们可以发现JaVa更多的功能,锻炼自己的能力,在失败中成长。参考文献1宋波.JaVa程序设计一一基于JDK6和NetBeanS实现M.北京:清华大学出版社,2013.2JDK6.0中文版3马士兵.尚学堂马士兵java视频教程北京:北京尚学堂

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号