资源描述
IJavaJava程序课程设计程序课程设计任任 务务 书书钟表的设计与开发钟表的设计与开发1 1、主要内容:主要内容:创建一个钟表。借助swing类和接口内部类的实现,在本程序中以实现Runnable接口内部类的形式创建多线程对象。Runnable接口只定义了一个run()方法,所以调用start和sleep()方法时,必须创建Thread实例化对象。Interrupt()方法的作用是中断线程。其作用方式是:多线程对象.interrupt()。2 2、具体要求(包括技术要求等):具体要求(包括技术要求等):系统的功能要求:系统的功能要求: 1.可以记录时间的钟表。 2.熟悉JAVA中swing的组件运用,基本工具的熟练掌握。学习并掌握以下技术:学习并掌握以下技术:JavaJava等。熟练使用以下开发工具:熟练使用以下开发工具:JCreator + JDK 1.6.0_02 等 实现系统上述的功能。实现系统上述的功能。3 3、进度安排:进度安排:12月28日 12月 29日:课程设计选题,查找参考资料 12月29日 1月2日: 完成程序代码的编写1月2日 1月3日:系统测试与完善1月4日 1月5日:完成课程设计报告,准备答辩4 4、主要参考文献主要参考文献1张帆.Java范例开发大全M.北京:清华大学出版社,2010:0-831.2耿祥义,张跃平.Java大学实用教程M.北京电子工业出版社,2008:213-216II摘要摘要随着经济全球化的发展,推动生活节奏的加快,也给时间赋予了更重要的意义。基于方便人们更好的掌握时间,我们小组设计出了这个小时钟。本时钟是一个基于Java语言设计而成的一个小程序,目的是显示时间,并且能调准时钟。整个程序从符合操作简便、界面友好、灵活使用的要求出发,完成调用、调整的全过程。本课程设计报告介绍了时钟的构成,论述了目标功能模块;给出了时钟设计的步骤,程序主要所用到的Swing组件以及graphics方法。 关键词关键词:时钟, III目目 录录摘要摘要.III目目 录录.IV第第1章章 引言引言 .11.1课程设计内容.11.2 任务分工.1第第2章章 时钟的设计时钟的设计 .22.1时钟功能的概述.22.1.1时钟数字显示.22.1.2时钟指针显示.22.1.2时钟的设置.2第第3章章 时钟的具体实现时钟的具体实现 .33.1界面设计.33.1.1程序流程图.33.1.1显示数字时钟效果显示数字时钟效果 .33.1.2显示指针时钟完全效果图显示指针时钟完全效果图 .43.1.3设置窗口效果图设置窗口效果图 .6第第4章章 结束语结束语 .8致谢致谢 .8附录附录 源代码源代码 .91第第1章章 引言引言1.11.1课程设计内容课程设计内容本时钟编写时用到了Java中的Swing组件以及graphics方法,并具有下列处理功能(1)显示时钟功能 显示钟表时间和数字时间(2)状态的可切换 通过调整框图的大小,可以在数字时钟和指针时钟之间进行切换。(3)可随时更改时钟时间 可以通过左下方的设置时间,即可更改显示时间及日历。1.21.2 任务分工任务分工2第第2章章 时钟的设计时钟的设计2.12.1时钟功能的概述时钟功能的概述本时钟不但可以显示数字时钟和钟表时钟,还可以通过调整框图的大小,可以在数字时钟和指针时钟之间进行切换。2.1.1时钟数字显示时钟数字显示运行程序后,可以直接看到数字型的时钟 2.1.2时钟指针显示时钟指针显示由于打开程序框的框图太小,无法清晰显示指针,我们将指针放在大框图下显示2.1.2时钟的设置时钟的设置本程序可以通过点击左下标的设置键进行调整校对时钟,同时还可以显示日历项3第第3章章 时钟的时钟的具体实现具体实现3.13.1界面设计界面设计界面设计中有用到swing组件的Button,3.1.1程序流程图程序流程图 3.1.1显示数字时钟效果显示数字时钟效果部分代码:/在窗体上显示时间String st;if(nowh10) st=0+nowh;else st=+nowh;if(nows%2=0) st+= ;else st+=:;if(nowm10) st+=0+nowm;else st+=nowm;g.setColor(getBackground();g.fillRect(L,T,120,100);开始Main()Clock()repaint()paint()drawclock()4g.setFont(new Font(Digital,Font.PLAIN,44);g.setColor(new Color(0,255,0,55);g.drawString(88:88,L+15,T+57);g.setColor(Color.white);g.drawString(st,L+15,T+57);/在窗体显示秒数3.1.2显示指针时钟完全效果图显示指针时钟完全效果图部分代码:/绘制图像 public void paint(Graphics g) /参数定义区Graphics2D g2D = (Graphics2D)g;Insets insets = getInsets();int L = insets.left/2,T = insets.top/2;/L和T分别是窗口边缘宽度的一半h = getSize().height;w = getSize().width;/h为窗口高度 g2D.setColor(Color.white);/设置前景色为白色r=h/2-L-T-5;/计算半径r的值x0=130+r-5+L;/计算圆心坐标y0=h/2+T-L;int fs;/调整窗口大小使合适if(h150) set.setLocation(2,h-60);else set.setLocation(0,350);/获取当前时间Calendar now= new GregorianCalendar();int nowh= now.get(Calendar.HOUR_OF_DAY);int nowm= now.get(Calendar.MINUTE);int nows= now.get(Calendar.SECOND);int noww= now.get(Calendar.DAY_OF_WEEK);/绘制时钟上的59个点ang=-90;if (h150)if (nows=0)g.setColor(Color.black);g.fillRect(L+120,T,w-120,h);g2D.setStroke(new BasicStroke(1f);for(int i=1;i=nows;i+)x=(int)(r-3)*Math.cos(RAD*ang)+x0);y=(int)(r-3)*Math.sin(RAD*ang)+y0);g.setColor(Color.white);g.drawLine(x,y,x,y);ang+=(360.0/59.0);/绘制时钟上的60个点else g2D.setStroke(new BasicStroke(1+h/100)/2);for(int i=1;i=60;i+)x=(int)(r-3)*Math.cos(RAD*ang)+x0);y=(int)(r-3)*Math.sin(RAD*ang)+y0);g.setColor(Color.white);g.drawLine(x,y,x,y);ang-=6;/绘制时钟上的12个点ang=60;g2D.setStroke(new BasicStroke(1+h/100);for(int i=1;i=12;i+)x=(int)(r)*Math.cos(RAD*ang)+x0);y=(int)(r)*Math.sin(RAD*ang)+y0);g.drawLine(x,y,x,y);ang-=30;63.1.3设置窗口效果图设置窗口效果图7部分代码:set.addActionListener(new ActionListener()/按钮添加监听public void actionPerformed(ActionEvent e)try Process p=Runtime.getRuntime().exec( control.exe Timedate.cpl);/调用Windows时间设置 catch(Exception m);8第第4章章 结束语结束语本程序基本完成了实验要求包括时钟的显示、数字日期的显示、秒表的设定并能完美的进行时间的任意设定。在代码的编写过程中错遇到的大困难有两个:一是对于钟表的绘制,开始利用graphics对钟表进行绘制。至此,程序已能完成各项基本要求的功能,我得意之处在时间的设定,该方法虽然笨,但是很实用!但是不足之处在于秒表停止之后再点击Start不能继续计时,即秒表只能使用一次,要解决这个问题,应该要参考更多线程方面的书本。为使程序更美观,还可以对界面的背景设置图片,为时钟增加声音,甚至添加闹钟功能,以使程序更完善,使用上更人性化。致谢致谢9附录附录 源代码源代码import javax.swing.*;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import java.awt.event.KeyEvent;import java.awt.*;import java.util.Calendar;import java.util.GregorianCalendar;import java.io.*;class Clock extends JFrame/参数定义区int x,y,x0,y0,r,h,w,olds_x=-100,olds_y,oldm_x,oldm_y,oldh_x,oldh_y,hh,old_h;/x0,y0圆心double ang,mm,ss,old_m; final double RAD=Math.PI/180;/定义弧度、角度转换常数 JButton set;/设置按钮 Icon icon;/按钮图片 /Clock构造方法 public Clock() super(时钟);/ 窗口标题“时钟” setDefaultCloseOperation(EXIT_ON_CLOSE);/定义窗口“关闭按钮”事件为关闭窗口 setSize(250,100);/设置窗口初始大小 setBackground(new Color(0,0,0,255);/设置背景颜色为黑色 setLocation(300,100);/设置窗口初始位置 setResizable(true);/窗口大小可调 setVisible(true);/窗口可见 this.setLayout(null);/设置布局为空 icon=new ImageIcon(set.png);set=new JButton(icon);set.setMnemonic(KeyEvent.VK_ALT);/设置按钮快捷键为:“Alt”set.setSize(20,20);/按钮大小add(set);set.addActionListener(new ActionListener()/按钮添加监听public void actionPerformed(ActionEvent e)try 10Process p=Runtime.getRuntime().exec( control.exe Timedate.cpl);/调用Windows时间设置 catch(Exception m);/添加计时器 时间间隔为0.1s int delay = 100; ActionListener drawClock = new ActionListener() public void actionPerformed(ActionEvent evt) repaint();/重画界面 ;new Timer(delay,drawClock).start();/绘制图像 public void paint(Graphics g) /参数定义区Graphics2D g2D = (Graphics2D)g;Insets insets = getInsets();int L = insets.left/2,T = insets.top/2;/L和T分别是窗口边缘宽度的一半h = getSize().height;w = getSize().width;/h为窗口高度 g2D.setColor(Color.white);/设置前景色为白色r=h/2-L-T-5;/计算半径r的值x0=130+r-5+L;/计算圆心坐标y0=h/2+T-L;int fs;/调整窗口大小使合适if(h150) set.setLocation(2,h-60);else set.setLocation(0,350);/获取当前时间Calendar now= new GregorianCalendar();int nowh= now.get(Calendar.HOUR_OF_DAY);int nowm= now.get(Calendar.MINUTE);int nows= now.get(Calendar.SECOND);int noww= now.get(Calendar.DAY_OF_WEEK);/绘制时钟上的59个点ang=-90;if (h150)if (nows=0)11g.setColor(Color.black);g.fillRect(L+120,T,w-120,h);g2D.setStroke(new BasicStroke(1f);for(int i=1;i=nows;i+)x=(int)(r-3)*Math.cos(RAD*ang)+x0);y=(int)(r-3)*Math.sin(RAD*ang)+y0);g.setColor(Color.white);g.drawLine(x,y,x,y);ang+=(360.0/59.0);/绘制时钟上的60个点else g2D.setStroke(new BasicStroke(1+h/100)/2);for(int i=1;i=60;i+)x=(int)(r-3)*Math.cos(RAD*ang)+x0);y=(int)(r-3)*Math.sin(RAD*ang)+y0);g.setColor(Color.white);g.drawLine(x,y,x,y);ang-=6;/绘制时钟上的12个点ang=60;g2D.setStroke(new BasicStroke(1+h/100);for(int i=1;i=12;i+)x=(int)(r)*Math.cos(RAD*ang)+x0);y=(int)(r)*Math.sin(RAD*ang)+y0);g.drawLine(x,y,x,y);ang-=30;/在窗体上显示时间String st;if(nowh10) st=0+nowh;else st=+nowh;if(nows%2=0) st+= ;else st+=:;if(nowm10) st+=0+nowm;else st+=nowm;g.setColor(getBackground();g.fillRect(L,T,120,100);g.setFont(new Font(Digital,Font.PLAIN,44);g.setColor(new Color(0,255,0,55);g.drawString(88:88,L+15,T+57);12g.setColor(Color.white);g.drawString(st,L+15,T+57);/在窗体显示秒数fs=r/9+17;/计算字体大小g.drawLine(L+120+10,T+10,L+120+10,T+10);if(nows10) st=0+nows;else st=+nows;g.setColor(new Color(0,0,0);g.fillRect(x0-fs/2,2*r/3+y0-3*fs/4,fs,3*fs/4);g.setFont(new Font(Digital,Font.PLAIN,fs);g.setColor(new Color(255,255,255,55);g.drawString(88,x0-fs/2,2*r/3+y0);g.setColor(Color.white);g.drawString(st,x0-fs/2,2*r/3+y0);g.drawLine(L+120+10,T+10,L+120+10,T+10);/显示AM、PMif(nowh=150)ss=90-nows*6;mm=90-nowm*6-(0.1*nows);hh=90-nowh*30-nowm/2;13g.setColor(new Color(255,255,255);g.fillOval(x0-2-h/150,y0-2-h/150,4+h/75,4+h/75);/擦除秒针g2D.setStroke(new BasicStroke(1f);if(olds_x0)g.setColor(getBackground();g.drawLine(x0,y0,olds_x,2*y0-olds_y);elseold_m = mm;old_h = hh;/绘制秒针x=(int)(r*0.9*Math.cos(RAD*ss)+x0;y=(int)(r*0.9*Math.sin(RAD*ss)+y0;g.setColor(Color.white);g.drawLine(x0,y0,x,2*y0-y);olds_x=x;olds_y=y;g2D.setStroke(new BasicStroke(1.5f);/擦除分针if(old_m!=mm)g.setColor(getBackground(); g.drawLine(x0,y0,oldm_x,2*y0-oldm_y);/绘制分针x=(int)(r*0.7*Math.cos(RAD*mm)+x0;y=(int)(r*0.7*Math.sin(RAD*mm)+y0;g.setColor(Color.white);g.drawLine(x0,y0,x,2*y0-y);oldm_x=x;oldm_y=y;old_m=mm;g2D.setStroke(new BasicStroke(2f);/擦除时针if(old_h!=hh)g.setColor(getBackground();g.drawLine(x0,y0,oldh_x,2*y0-oldh_y);/绘制时针x=(int)(r*0.5*Math.cos(RAD*hh)+x0;y=(int)(r*0.5*Math.sin(RAD*hh)+y0;g.setColor(Color.white);g.drawLine(x0,y0,x,2*y0-y);14 oldh_x=x; oldh_y=y; old_h=hh; /主方法public static void main(String args)Clock c = new Clock();/创建一个Clock对象
展开阅读全文