佛山科学技术学院《可视化编程技术》课程设计报告时钟日历设计学生姓名:学号:年级专业:指导老师:学院:广东★佛山提交日期:2014年6月目录1.前言 (2)2.概要设计 (3)2.1开发环境 (3)2.2时钟日历功能 (3)2.3界面设计 (3)2.4类的框架结构图 (4)3.详细设计 (5)3.1使用的JAVA类的说明 (5)3.2类的主要方法 (6)3.2.1设置3个按钮 (6)3.2.2日历、时钟、界面的绘制 (7)3.2.3导入素材文件 (10)3.2.4设计总体认识 (11)4.运行结果 (11)5.测试分析 (11)5.1程序运行情况 (11)5.2程序异常处理 (12)6.源程序 (13)参考文献 (23)设计总结 (24)摘要:该程序是一个图形界面的简单的java时钟日历,具有良好的界面。
该程序可以自动获取系统日期和时间。
还可以翻看万年历,在点选日期的时候会有音效。
程序中还有个会移动的图形条,在右侧则有一个时钟图形,会跟着实时时间动。
下方三个按钮可以播放一个声音,PLAY则播放一次,LOOP则循环播放,STOP则停止播放声音。
关键字:java、日历类、时钟类、声音类、方法、事件1前言随着科学技术的不断发展,计算机已经成为我们工作学习和生活中不可缺少的工具。
文本编辑器是个人计算机最司空见惯的应用程序了,在学习了Java语言之后,我决定使用Java语言编写一个简单的计算器,可以实现简单的运算功能,满足日常基本的工作学习和娱乐需要。
Java是由Sun公司开发的新一代纯面向对象的网络编程语言。
其目标是建立一种在任意种机器、任一种操作系统的网络环境中运行的软件,实行所谓的“程序写一次,到处运行”的目标。
正因为如此,Java已成为当今Internet上最流行、最受欢迎的一种程序开发语言。
Java开发小组把Java按特性分为基本版、移动版、企业版,每个版本有一个软件开发包。
Java基本版本叫Java2标准版(Java2Standard Edition,J2SE),它包含建立Java应用程序或者是Applet所需的应用程序编程接口(API)。
Java 2移动版(The Java2Mobile Edition,J2ME)包含创建无线Java应用程序的API。
还有Java2企业版(The Java2Enterprise,J2EE)是J2SE的增强版本,包含建立多层架构应用程序API。
Java语言是由C++语言发展起而来的,是一种彻底的面向对象的程序设计语言。
作为一种纯面向对象的程序设计语言,它非常适合大型软件的开发。
Java 语言去掉了C++语言的一些容易引起错误的特性。
Java语言的特点有:面向对象、跨平台、安全性、多线程和图形功能强。
2概要设计2.1开发环境开发平台:Microsoft Windows7旗舰版Service Pack1开发工具:Eclipse+JDK1.6.0_022.2时钟日历功能功能1:显示实时日期功能2:显示实时时间功能3:翻看万年历功能4:单次播放声音功能5:循环播放声音功能6:停止播放声音2.3界面设计图2.3时钟日历面板2.4类的框架结构//Film是描述滚动图片的类.class Film extends Canvas implements Runnable{ public void run(){}public void paint(Graphics g){}public void update(Graphics g){}}//AudioPlayer是描述底部音乐播放条的类.class AudioPlayer extends Panel{public boolean action(Event e,Object p){}}//Calendar是描述日历和时钟的类.class Calendar extends Panel implements Runnable{ public void run(){}public void paint(Graphics g){}public void update(Graphics g){}public boolean action(Event evt,Object arg){}public boolean mouseDown(Event evt,int x,int y){} public boolean lostFocus(Event evt,Object what){} public boolean keyDown(Event evt,int key){} }//主类public class MyApplet extends Applet{public void init(){}public void start(){}public void stop(){}public void destroy(){}}3详细设计3.1使用的Java类的说明类名:Film作用:描述滚动图片的继承的父类:Canvas类实现的接口:没有class Film extends Canvas implements Runnable{public void run(){}public void paint(Graphics g){}public void update(Graphics g){}}类名:AudioPlayer作用:描述底部音乐播放条的类.继承的父类:Panel类实现的接口:没有class AudioPlayer extends Panel{public boolean action(Event e,Object p){}}类名:Calendar作用:描述日历和时钟的类.继承的父类:Panel类实现的接口:Filmclass Calendar extends Panel implements Runnable{public void run(){}public void paint(Graphics g){}public void update(Graphics g){}public boolean action(Event evt,Object arg){} public boolean mouseDown(Event evt,int x,int y){}public boolean lostFocus(Event evt,Object what){}public boolean keyDown(Event evt,int key){} }类名:MyApplet作用:主类.继承的父类:Applet类实现的接口:Calendar、AudioPlayerpublic class MyApplet extends Applet{public void init(){}public void start(){}public void stop(){}public void destroy(){}}3.2类的主要方法3.2.1设置3个按钮:public boolean action(Event e,Object p){if(e.target==play){au.play();}else if(e.target==loop){au.loop();}else if(e.target==stop){au.stop();}return super.action(e,p);}3.2.2日历、时钟、界面的绘制:public void update(Graphics g){int i,j;Dimension d=size();Image offImage=createImage(d.width,d.height);Graphics offG=offImage.getGraphics();//set the background colorsetBackground(new Color(242,160,255));offG.setColor(getBackground());offG.fillRect(0,0,500,350);//draw calendar shadowoffG.setColor(new Color(80,150,80));offG.fillRect(25,100,340,230);//draw calendar baseoffG.setColor(new Color(100,230,195));offG.fillRect(15,90,340,230);offG.setFont(new Font("Helvetica",Font.BOLD,20));for(i=0;i<=6;i++){offG.setColor(Color.darkGray);offG.drawString(weekName[i],26+i*48,110);offG.setColor(Color.white);offG.drawString(weekName[i],24+i*48,108);}//draw author informationoffG.setColor(Color.gray);offG.drawString("12教育技术2班刘思华2012914205",10,350);//draw vertical barsfor(i=350;i>0;i-=10){offG.setColor(new Color(170+85*i/350,255,170+85*i/350));offG.fillRect(380,i,40,9);}//draw yearoffG.setColor(new Color(200,255,200));offG.setFont(new Font("Courier",Font.ITALIC,66));String yearString=""+(1900+today.getYear());for(j=0;j<=6;j+=2)for(i=0;i<=3;i++)offG.drawString(yearString.substring(i,i+1),415+j,168+49*i);//draw horizontal barsoffG.setColor(Color.black);offG.drawLine(6,60,250,60);offG.setColor(new Color(100,200,100));offG.drawLine(5,65,495,65);offG.drawLine(5,66,495,66);//draw circlesoffG.setColor(Color.black);offG.drawOval(560,5,120,120);offG.setColor(Color.black);offG.drawOval(570,15,100,100);//draw MonthoffG.setFont(newFont("Monospaced",Font.BOLD+Font.ITALIC,25));offG.setColor(Color.orange);offG.drawString(monthName[today.getMonth()],280,57);//draw dateFont myFont=new Font("DialogInput",Font.BOLD,50);FontMetrics fontSize=getFontMetrics(myFont);offG.setFont(myFont);String temp=""+today.getDate();Color dateColor=new Color(weekColor[today.getDay()]);int x=380-fontSize.stringWidth(temp)/2;int y=59;offG.setColor(dateColor.brighter());offG.drawString(temp,x-1,y-1);offG.setColor(dateColor.darker());offG.drawString(temp,x+1,y+1);offG.setColor(dateColor);offG.drawString(temp,x,y);//draw clockoffG.setColor(Color.black);offG.drawOval(560,60,10,10);//9点offG.drawOval(670,60,10,10);//3点offG.drawOval(615,5,10,10);//12点offG.drawOval(615,115,10,10);//6点offG.drawOval(571,36,5,5);//10点offG.drawOval(591,16,5,5);//11点offG.drawOval(644,16,5,5);//1点offG.drawOval(663,36,5,5);//2点offG.drawOval(663,89,5,5);//4点offG.drawOval(644,109,5,5);//5点offG.drawOval(591,109,5,5);//7点offG.drawOval(571,89,5,5);//8点Date now=new Date();double hour=now.getHours()+now.getMinutes()/60.;double minute=now.getMinutes()+now.getSeconds()/60.;double second=now.getSeconds();offG.setColor(Color.black);offG.drawLine(620,65,(int)(620+30*Math.sin(hour*Math.PI/6)),(int)(65-30 *Math.cos(hour*Math.PI/6)));offG.drawLine(620,65,(int)(620+45*Math.sin(minute*Math.PI/30)),(int)(65 -45*Math.cos(minute*Math.PI/30)));offG.setColor(Color.black);offG.drawLine(620,65,(int)(620+48*Math.sin(second*Math.PI/30)),(int)(65 -48*Math.cos(second*Math.PI/30)));//draw calendar datesboolean raised;offG.setFont(new Font("Serif",Font.PLAIN,15));Date newDay=new Date(today.getYear(),today.getMonth(),1);newDay.setDate(1-newDay.getDay());//找出日历左上角的日期for(j=0;j<=5;j++){for(i=0;i<=6;i++){offG.setColor(new Color(220,255,165));if(today.getDate()!=newDay.getDate()||today.getMonth()!=newDay.getMonth())raised=true;//其他日期,按钮上浮elseraised=false;//当前日期,按钮下沉offG.fill3DRect(17+i*48,114+j*34,48,34,raised);if(today.getMonth()==newDay.getMonth())offG.setColor(Color.black);//本月日期,黑色elseoffG.setColor(Color.black);//他月日期,浅色offG.drawString(""+newDay.getDate(),20+i*48,129+j*34);newDay.setDate(newDay.getDate()+1);}}g.drawImage(offImage,0,0,this);}3.2.3导入素材文件:public void init(){String auname=getParameter("auname");if(auname==null){auname="ding.au";}AudioClip au=getAudioClip(getCodeBase(),auname);audioPlayer=new AudioPlayer(au);Image thumb=getImage(getCodeBase(),"thumb.gif");au=getAudioClip(getCodeBase(),"chirp.au");calendar=new Calendar(thumb,au);setLayout(new BorderLayout());add("Center",calendar);add("South",audioPlayer);}3.2.4设计的总体认识●JAV A设计的摘要●JAV A设计的目录结构●JAV A设计的概要和详细设计●JAV A设计的版权意识●JAV A设计需要编译的环境●JAV A设计的实用性4运行结果图4程序运行结果5测试分析5.1程序运行情况:程序正常的响应按钮事件,输入到输入框的数据数值可能不是数字,导致程序异常,因此使用了try{}catch(NumberFormatException e){}setDateText();return true;将数据变回原来的数据值,防止程序异常。