JAVA课程设计-模拟时钟_第1页
JAVA课程设计-模拟时钟_第2页
JAVA课程设计-模拟时钟_第3页
JAVA课程设计-模拟时钟_第4页
JAVA课程设计-模拟时钟_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录第1章课题概述 第1章课题概述本次JAVA课程设计的题目是设计并实现模拟时钟,时钟的界面包括表盘和指针并用数字表显示时间。1.1课题的目的随着经济全球化地不断发展,人们对于时间概念越来越重视。时钟是人们把握时间最直接的工具。为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练应用面向对象的思想和设计方法解决实际问题的能力,巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、Eclipse等开发工具的运用,掌握了Java中的Swing组件、graphics方法及多线程技术的应用,拓宽常用类库的应用。将所学的理论知识运用到实际操作中去,以此来发现不足,及时的改正。在实际的操作中学习及运用还没有学过的知识,提高学习能力与运用能力。在调试与测试的过程还可以提升改错能力,同时也是经验的积累。1.2课题的要求本次课程设计做的是Java模拟时钟。通过图形界面、线程等技术的综合应用,实现模拟时钟的基本功能。1.2.1图形的绘制(1)所绘图形的界面包括表盘和指针。(2)用数字表显示时间(3)所绘时钟应整齐、清晰,以便用户能够一眼准确得知当前时间。1.2.2多线程技术(1)要求时钟与数字表是动态的效果。(2)要求时钟与数字表每秒刷新一次。第2章概要设计2.1整个程序的模块结构及流程根据课题要求,整个程序按功能可划分为界面、钟面绘制、时针绘制和线程这四个主要模块。程序各功能模块的划分,及主要流程如图2-1所示。图2-1整个程序各功能模块间的流程2.2窗口的绘制Swing组件是在AWT组件基础上发展起来的新型GUI组件。Swing不但用轻量级组件代替了AWT中的重量级组件,而且Swing组件中增加了一些新特性。所以选用Swing组件。JFrame容器属于顶级容器组件,是JavaApplication的GUI容器。JFrame类包括支持任何通用窗口特型的基本功能。利用JFrame创建一个长为600,宽为600的窗口;将窗口位置定在坐标(450,100)处;把窗体设计为固定大小,并设置单击关闭窗口按钮操作。2.3图形绘制与刷新2.3.1图形绘制图形的绘画是通过paint()方法实现。paint()方法属于Container类,以画布为参数,在画布上执行画图的方法。2.3.2图形刷新图形显示的刷新通过repaint()方法实现。repaint()方法调用update()方法从而调用paint()方法,实现刷新。2.4钟面绘制2.4.1Graphics、Graphics2DGraphics相当于画笔的作用,通过Graphics画出圆、指针,并且绘制时钟上的12个数字。例如:钟盘是通过graphics中的drawOval(intx,inty,intw,inth)方法绘制的圆其实是矩形的内接圆,x、y是正方形左上角的点坐标,w、h为矩形的长和宽。但由于Graphics无法实现修改所画图形的粗细、虚实等一些功能,所以引入Graphics的拓展类Graphics2D,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在Java平台上呈现二维形状、文本和图像的基础类。2.4.2坐标在java中坐标原点(0,0)位于整个绘画平面的左上角,从原点(0,0)出发向右为x轴,向下为y轴。所有的坐标必须是正整数,不能带有小数,一个单位代表一个像素。计算钟盘数字的“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连接两点画出直线段,并设置不同的颜色、粗细。2.6获取时间通过JDK底层提供的Calendar类中的DAY_OF_WEEK,MONTH,DATE,HOUR_OF_DAY,MINUTE,SECOND,YEAR方法获得当前的时间。Calendar中的月份是从0开始计算的,所以获得的月份要加1。Calendar中的星期是从星期天开始,这与我们每个星期从星期一开始有所不同,所以排版时需要把星期天放在首位。2.7多线程的运用在语言及层面上支持多线程程序设计是Java的一个重要特性。多线程是指一个程序中包含多个执行流,多线程是实现并发的一种有效手段。2.7.1线程创建线程的创建有两种方法:1.通过继承Thread类创建线程。2.通过实现Runnable接口创建线程。两种方法相比,虽然运用第一种继承Thread类的方法创建线程的程序代码较为简单,并可以在run()方法中直接调用线程的其他方法。但我更偏爱于通过第二种实现Runnable接口的方式创建线程。首先,实现Runnable接口的方法不会影响到Thread类的体系,符合面向对象设计的思想。其次,该方法便于继承其他的类,因为一个类只能继承一个类,但可以实现多个接口,适合资源的共享。2.7.2线程运行线程在创建之后,就开始了它的生命周期。图2-2线程的生命周期run()方法的实现是通过start()方法的调用。线程调用sleep()方法进入睡眠状态。2.8屏幕闪动问题Swing方法自带双缓冲是通过paint()方法实现的,可是因为重写了paint()方法,所以破坏了Swing的双缓冲,出现屏幕闪动问题。为解决屏幕闪动问题,引入BufferedImage。BufferedImage是image抽象类的实现,它将图形放入内存缓冲区中,可以实现图片双缓冲。双缓冲就是先在内存中的另一张“画布”上进行多次绘图,然后把画好的图在一次性画到屏幕上从而解决闪屏的问题。第3章程序功能的实现3.1主函数的实现创建一个clock对象,通过clock对象调用ThreadClock()方法。因为Runnable接口只定义了一个run()方法,所以调用start()和sleep()方法时,必须创建Thread的实例化对象,并通过线程的start()方法调用run()方法。publicstaticvoidmain(String[]args){ ThreadClockclock=newThreadClock(); newThread(clock).start(); }3.2主要功能模块的实现3.2.1窗口的实现创建一个窗口,设置窗口的名字、窗口大小的长宽为600,600、窗口显示位置在坐标(450,100)处。设置单击关闭窗口按钮操作。设置可见性为true。固定窗口的大小。创建窗口代码如下:publicThreadClock(){ super("数字时钟");//设置窗口名字 setSize(600,600);//设置窗口大小 setLocation(450,100);//设置窗口位置 setDefaultCloseOperation(DISPOSE_ON_CLOSE); setVisible(true); setResizable(false); }3.2.2图形绘制的实现图形的绘制是通过paint()方法实现。通过drawImage方法,绘制boardDisplay中的图像。图像的左上角位于该图形上下文坐标空间的(0,0)。图形绘制的代码实现如下:publicvoidpaint(Graphicsg){ g.drawImage(boardDisplay,0,0,null); }3.2.3绘画钟盘的实现通过Graphics相当于“画笔”,在画布上画出钟盘的图形。将Graphicsg强制转换为Graphics2D。定义一个Stroke接口的x对象,实现BasicStroke类方法,将所画钟盘轮廓的性质,粗为标准粗细的3倍,轮廓为虚线,赋给x,用x画出所需的钟盘轮廓。用setFont()方法设置字体。计算钟盘、数字的坐标位置,通过drawString()画出钟盘与数字。绘画钟盘的代码实现如下:Graphicsg=boardDraw.getGraphics(); Graphics2Dg2d=(Graphics2D)g; Strokex; g.setColor(Color.WHITE); g.clearRect(0,0,boardDraw.getWidth(),boardDraw.getHeight()); g.fillRect(0,0,boardDraw.getWidth(),boardDraw.getHeight()); //画钟盘 g.setColor(Color.BLACK); x=newBasicStroke(3f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,0,newfloat[]{17,4},0);//设置粗线、虚线 g2d.setStroke(x); g.drawOval(100,100,400,400); g.setFont(newFont("Times",Font.BOLD,25));//设置字体 g.setColor(Color.RED); //画钟盘数字 g.drawString("12",287,130); g.drawString("6",293,480); g.drawString("9",125,310); g.drawString("3",470,310); g.setFont(newFont("Times",Font.BOLD,20)); g.setColor(Color.BLUE); g.drawString("1",382,157); g.drawString("2",442,222); g.drawString("4",442,390); g.drawString("5",382,457); g.drawString("7",211,457); g.drawString("8",151,390); g.drawString("10",148,222); g.drawString("11",210,157); g.fillOval(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,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(Color.BLUE); DrawHands(g,minute/60.0,150); g2d.setStroke(newBasicStroke(4f)); g.setColor(Color.BLACK); DrawHands(g,(hour)/12.0,120);//计算角度与坐标的函数表达式privatevoidDrawHands(Graphicsg,Doublepercent,intlength){ doubledegree=360*percent; intx=(int)(300+Math.cos(2*Math.PI*(90-degree)/360) *length); inty=(int)(300-Math.sin(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方法,对时间输出格式进行的排版。定义数字表显示的位置坐标。获取、输出时间,数字表的代码实现如下:Calendarc=Calendar.getInstance(); intweek=c.get(Calendar.DAY_OF_WEEK); intmonth=c.get(Calendar.MONTH); intday=c.get(Calendar.DATE); inthour=c.get(Calendar.HOUR_OF_DAY); intminute=c.get(Calendar.MINUTE); intsecond=c.get(Calendar.SECOND); intyear=c.get(Calendar.YEAR); //时间输出形式排版 String[]weekName={"星期日","星期一","星期二","星期三","星期四","星期五", "星期六"}; StringtimeString=String.format( "%s%s年%d月%d日%02d:%02d:%02d",weekName[week],year, month+1,day,hour,minute,second); g.drawString(timeString,150,550);//数字表显示位置 Strings="北京时间"; g.drawString(s,75,75);3.2.6多线程的实现调用Runnable接口中的run()方法,run()方法的实现是通过start()方法的调用。调用sleep()方法进入睡眠状态,因为时针是一秒一动,所以睡眠时间是1000毫秒,也就是1秒。异常处理。多线程的代码实现如下:publicvoidrun(){ while(this.isShowing()){this.repaint(); try{ Thread.sleep(1000); }catch(Exceptione){ System.out.println(e); } } }3.2.7解决屏幕闪动的实现创建两块“画布”,一块用于多次绘画boardDraw,另一块用于显示绘画boardDisplay。先在内存中的一张“画布”上进行多次绘图,然后把画好的图在一次性画到屏幕上从而解决闪屏的问题。解决屏幕闪动的代码实现如下:privateBufferedImageboardDraw;privateBufferedImageboardDisplay;boardDraw=newBufferedImage(this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB); boardDisplay=newBufferedImage(this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB);BufferedImagetmp=boardDisplay; boardDisplay=boardDraw; boardDraw=tmp;第4章调试及发现问题的解决当我编好了一个无语法错误的程序时,以为大功告成,其实不然。程序依旧与想要得到的最终效果有些不同,这些问题是我在编程的过程中所忽视的。1、通过Calendar获取的时间与正确时间有所差别。解决方法:通过查找JDK中Calendar方法,发现Calendar中的月份是从0开始计算的,所以获得的月份要加1,并且Calendar中的星期是从星期天开始,这与我们每个星期从星期一开始有所不同,所以排版时需要把星期天放在首位。2、通过准确计算获得的坐标所显示出来的钟表中数字的位置与想象中的有所不同,指针并没有指向数字的中心,甚至有些数字有被挤出来的感觉。解决方法:在制作过程中,我忽视了确定数字位置的坐标并不是指数字中心点的坐标位置。所以我根据运行的时钟的指针指向的位置,对数字的位置进行了略微的调整,使指针指向数字中心。3、在程序运行过程中,出现了屏幕闪动的问题。解决方法:我上网查找了解决屏幕闪动问题,发现原本Swing方法是自带双缓冲功能,并且是通过paint()方法实现的。可是因为我重写了paint()方法,所以破坏了Swing的双缓冲,出现屏幕闪动问题。为解决屏幕闪动问题,我引入BufferedImage。BufferedImage是image抽象类的实现,它将图形放入内存缓冲区中,可以实现图片双缓冲。我创建了两块“画布”,一块用于多次绘画boardDraw,另一块用于显示绘画boardDisplay。先在内存中的一张“画布”上进行多次绘图,然后把画好的图在一次性画到屏幕上从而解决闪屏的问题。4、钟盘的美化,钟盘轮廓线条变粗、变成虚线。解决方法:定义一个Stroke接口的x对象,实现BasicStroke类方法,将线条性质自定义为粗是标准粗细的3倍,轮廓为虚线,赋给x,用x画出所需的钟盘轮廓。就像画图工具一样,先选择笔刷的粗细、颜色、样式,再画出所要的图形。第5章程序测试及分析通过主函数中的start()调用run()方法,开始绘制时钟,并通过repaint()刷新paint(),休眠时间为1秒,这样便产生了指针一秒走动一次的效果。运行程序,便会看到如下的时钟。时间与电脑上的时间一致,钟盘整齐、干净,无屏幕闪动问题。图5-1时钟第6章总结通过一个星期的Java课程设计,不仅使我对Java语言有了更深刻的认识和了解,而且使我其他方面的能力也得到了提高。1、编写程序需要冷静的大脑,心急吃不了热豆腐。一开始拿到模拟时钟这一道题目时,我是毫无头绪的。我不知道怎么画时钟、怎么获取时间、怎么样可以使指针走动等等问题,不知道从何下手。我便拿了一支笔,在纸上画了起来。我最终要得到的是一个时钟,然后就是组成时间的功能,接着就是实现功能的方法……,慢慢的,一个程序的框架图便浮现在了纸上,我的大脑也慢慢的冷静下来,对自己要做的程序有了一个初步的框架和计划。有时一笔一纸,可以帮助你整理思路,使自己冷静下来,对程序有一个更好规划。2、基础知识很重要一开始学习Java语言的时候,我心里十分烦躁,各种定义名称的要求,int、double的转换,循环等等的Java基础知识,让我觉得知识点很乱,很难能一下子就可以全部记住、理解、运用,并且当几天不敲代码,就会容易遗忘。那时候觉得没什么,下次用的时候再翻翻书就可以了。但是通过这一次的课程设计,我发现Java的程序离不开基本框架、基础知识,那些最基础的知识是必须要牢记于心的,否则你根本想不起来这里是要用到这个知识点,更别说通过翻书的方式来详细查找这个知识点的方式、用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论