《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(z,1,g.drawString(2”,g.drawString(z,4zz,g.drawString(5”,g.drawString(7”,g.drawString(8”,g.drawString(z,10,148,222);