《java课程设计--模拟时钟.docx》由会员分享,可在线阅读,更多相关《java课程设计--模拟时钟.docx(14页珍藏版)》请在优知文库上搜索。
1、目录(模拟时钟)第1章课题简述21.1 课题的目的21.2 课题的要求21.2.1 运行的窗口界面的要求21.2.2 程序实现的功能要求2第2章设计思路展示22.1 整个程序的模块结构及流程22.2 实现可显示窗口界面32.3 通过多线程重绘界面32.4 重写paint(GraphicsG)方法32.4.1绘制表盘32.4.2获取系统时间42.4.3绘制指针并显示具体时间42. 4.4增加功能5第3章程序功能的实现62.1 主函数的实现62.2 主要功能模块的实现63. 2.1使用多线程重绘界面63. 2.2获取系统时间并绘制时钟界面7第4章调试及发现问题的解决11第5章程序测试及分析12第6
2、章总结13参考文献14第1章课题简述本次编程语言基础课程设计的题目是设计模拟时钟。1.1 课题的目的模拟时钟是日常生活中所必须的工具。在各种环境下,比如晨起、上下班、各种考试,人们常常需要指示时间的工具,以合理分配时间,达到按时或者及时完成工作或者学习任务的目的,帮助用户实现时间最合理的使用。因此这类工具通过java、C语言等编程语言直接实现具有较大的实际意义。通过模拟时钟课程设计课题的实现,掌握并熟练使用java编程语言的多线程技术,以及GUl技术和日期时间类的使用。为日后的专业课学习打好基础,做好充足准备。1.2 课题的要求1.2.1 运行的窗口界面的要求(1)在窗口绘制表盘和指针指示时间
3、点和其变化。(2)在窗口用数字表显示时间点及其变化。(3)在窗口显示系统日期,包括年月日、上下午和星期。(4)界面显示要美观、简洁易懂,便于用户使用,和获取其需要的相应的时间日期信息。1.2.2 程序实现的功能要求本课题要求通过多线程以每秒的间隔重绘窗口界面,获取系统时间,不断更新显示在窗口界面,以时刻正确指示用户系统时间。Cchongxipaint(Graphicsg)第2章设计思路展示2.1 整个程序的模块结构及流程根据课题要求,整个程序需要一个可显示的窗口界面,在界面上显示不断更新的系统时间。系统时间的显示需要表盘及指针和数字显示,界面重绘和更新通过多线程实现,接下来获取系统时间并重写p
4、aint(Graphicsg)将系统时间显示在窗口界面上。窗口界面模拟时钟数字时钟图2-1程序界面结构图2.2 实现可显示窗口界面由于用户需要在程序一次运行后能够不断获取相应时间日期信息,也就是说,这个运行结果要始终保留给用户,所以可以通过一个可视化的窗口把信息呈现给用户。这个可视化的窗口要求可以显示给用户,它应该有美观的外观,简洁的图形元素,相应的信息输出。一般情况下,用户需要对窗口进行指示,比如调整窗口大小,使得窗口显示或者隐藏,这都需要程序员事先考虑到并通过代码来实现符合用户需要的这些各项功能,以便用户实现。2.3 3通过多线程重绘界面根据课题要求,创建模拟时钟小程序,需要按照固定的时间
5、间隔更新窗口信息,比如时间元素里的秒需要按照一秒的时间间隔去更新,分钟按照60秒的时间间隔去更新,小时按照3600秒的时间间隔去更新,年月日、上下午等需要更长的时间间隔去更新,实现窗口界面的重绘需要用到多线程,选取所有时间间隔的最小值作为重绘界面的休眠值。如,语句Thread.sleep(1000);2. 4重写paint(Graphicsg)方法2.4. 1绘制表盘根据课题要求,模拟时钟的内容要求包括通过模拟时钟显示时间信息。市面上的模拟时钟有不同的外边框,包括矩形、方形和各种动物轮廓形,这里选取标准圆作为模拟时钟的外边框,原因为圆为时钟的传统外边框,具有线条流畅、表现时间点更为直观等特色。
6、外边框由均匀分布的粉色和灰色小圆点组成,这里所有原点不止形成圆形的外观组合,由于其均匀分布在圆内,还能表示时钟上指示时间的60个点,所有原点由48个粉色单色点和12个粉灰双色点组成。表盘除了指示时间的点外,按照表盘外观,圆,的元素特色,特地在圆心处添加了字符串“Karry”,增强可视行与美观性。为了完成圆的绘制,需要获得窗口的高度和宽度,以此作为表盘绘制的参数,以便表盘大小尺寸与窗口大小尺寸相协调。同时创建两个成员变量rl,r2接收这两个参数,代码为rl=getSize().Width/2-40;r2=getSize().height2-T-40;具体如图2-3所示。指针的绘制将在获取时间后实
7、现。karry图2-1模拟时钟的表盘初步展示2.4.2获取系统时间完成模拟时钟小程序必不可少的是获取系统时间,这就要用到时间和日期类Calendar及其子类GregorianCalendar,通过类名创建Calendar对象指向其子类GregorianCalendar,具体代码为:Calendartime=newGregorianCalendar();那么就可以通过对象名time调用Calendar类及其子类GregorianCa1endar的内部方法,若要使用类中特有字段,由于字段的定义为“static”,可以通过类名使用,比如通过使用Calendar类中特有字段和其内部方法get()获取时
8、间元素中“分钟”这个时间元素,可以使用以下语句:intminute=time,get(Calendar.MINUTE);GregorianCalendar类相对于Calendar类新增了字段和方法,以便对时间日期进行操作。2.4.3 绘制指针并用显示具体时间指针用来指示时间的变化,要根据具体时间来绘制,所以再获取系统时间之后绘制指针。指针包括时针、分针和秒针。根据习惯,时针、分针、秒针的长度依次增长、宽度依次减小,所以再绘制指示不同时间元素的指针的时候都需要重新设置画笔的属性,比如绘制时针时,画笔的设置为g2D.setstroke(newBasicStroke(2.5f);而绘制分针时画笔设置
9、为g2D.SetStroke(newBasicStroke(2.Of);但是对于指针不同的长度绘制,要通过画笔绘线的始末坐标差异来完成,具体再3.2.2获取系统时间并绘制时钟界面这一章节讲解。2.4.4 增加功能为了使用户在获取时间信息的同时也获得具体日期信息,在窗口里同时显示了年月日信息,包括用英文显示的星期信息。第3章程序功能的实现3.1主函数的实现在主函数实现之前,一方面需要定义X,y,x,y,rl,r2,sh,mh,hh和ang这些变量,以及常量浮点型常量RAD,同时初始化RAD,finaldoubleRAD=Math.PI180;完成角度和弧度的转换,方便设置指针转动的角度。另一方面
10、为使用线程,需要创建线程对象ThreadCIoCk二null;接下进入主函数的实现,在主函数里完成窗口的属性设置。主要代码如下:publicsimulationclock()为窗口设置标题SUPer(模拟时钟);设置窗口的组件排列方式SetLayout(newFlowLayoutO);设置窗口的弹出位置和大小,因为要增强模拟时钟小窗口的特色,在小窗口上部添加了标签,所以增加了小窗口的高度,以便表盘以圆的轮廓显示。setBounds(100,100,400,420);添加标签Labelbutton=newLabeI(蜿蜒的,沿途一路曲折,有时候相信的,未必开花结果);add(button);be
11、gin();设置窗口关闭按钮可实现关闭事件addWindowListener(newWindowAdapterOpublicvoidWindowClosing(WindowEvente)System,exit(0););设置窗口可见SetVisible(true);3.2主要功能模块的实现3.2.1使用多线程重绘界面本次课题里使用多线程来控制程序运行进程,通过编写类Clock继承父类Frame的同时也继承接口Runnable,并实现其内部方法run(),在Clock内部通过类名Thread创建线程对象ClOCk,通过线程对象调用线程类内部方法Start(),从而启动线程,使得程序启动后运行。程
12、序里相应语句为:publicclasssimulationclockextendsFrameimplementsRunnableThreadclock;publicsimulationclock()begin();创建无返回值的方法publicvoidbegin()if(clock=null)将自身线程对象作为参数传给其构造方法,获得新的线程值,赋值给线程clockclock=newThread(this);调用线程类内部方法start()启动线程clock,start();实现接口Runnable中run()publicvoidrun()如果线程值为空,重画界面while(clock!=nu
13、ll)重画界面repaint();由于方法sleep()的定义:publicstaticvoidsleep(longmillisecond)throwInterruptedException要把SIeeP()的调用放在try-catch语句里面捕获异常tryThread,sleep(100O);catch(InterruptedExceptione)e.PrintStackTrace();3.2.2获取系统时间并绘制时钟界面由于位于父类的父类的方法paint(Graphicsg)可以直接在窗口容器上绘制图形元素,获取系统时间并绘制时钟界面在重写的方法Paint(GraPhiCSg)中直接完成。
14、publicvoidpaint(Graphicsg)使父类画笔Graphicsg强制转化成Graphics2Dg2DGraphics2Dg2D=(Graphics2D)g;绘制时钟表盘intL=insets,left2,T=insets,top/2;设置表盘的长宽标准rl=getSize().width2-L-40;r2=getSize().height2-T-40;设置表盘的圆心位置x0=rl+20+L+30;y0=r2+20+T+50;g.drawString(,zkarry,x0-10,y0+5);绘制时钟上的点绘制12数字,和对应的十二个点十二个数字或者圆点均匀分布在表盘上,因此把圆盘
15、均分成十二个区域,每个区域所占弧度值为30;ang=30;for(inti=l;i=12;i+)由于窗口容器坐标原点位置,在窗口左上角,当设置坐标X值为半径的sin值时要同时加上表盘的圆心的坐标x值X=(int)(rl-20)*Math.sin(RAD*ang)+x);当设置坐标y值为半径的cos值时要同时用表盘的圆心的坐标y值减去它y=(int)(y0-(r2-20)*Math.cos(RAD*ang);设置画笔属性,包括画笔粗细、画笔颜色g2D.SetStroke(newBasicStroke(4.Of);g.SetColor(Color,gray);画Srting类型的数字g.drawString(zzzz+i,x,y);画短线类型的原点g.drawLine(x,y,x,y-2);增加ang数据的类型,改变数字或者原点坐标ang+=30;绘制六十个点六十个圆