Java万年历课程设计任务书剖析.docx
《Java万年历课程设计任务书剖析.docx》由会员分享,可在线阅读,更多相关《Java万年历课程设计任务书剖析.docx(16页珍藏版)》请在冰豆网上搜索。
Java万年历课程设计任务书剖析
信息科学与工程学院课程设计
题目:
Java万年历设计
姓名:
学号:
20
班级:
201
课程:
Java项目实训
任课教师
2015年5月20日
课程设计任务书及成绩评定
题目
课程设计的任务及要求
任务:
设计一个功能齐全,实用的XXX软件。
软件设计合理、界面设计美观。
具体要求:
写明该软件完成了哪些功能
课程设计所需的软件、硬件等
硬件环境:
Iterl(R)Core(TM)2DuoCPU,主频2.31GHz;内存3G;
硬盘320G以上;1024×768显示分辨率
软件环境:
JDK6.0以上、eclipse等
设计报告:
1、设计目的和任务
2、总体设计:
包括程序设计组成框图、流程图。
3、详细设计:
包括模块功能说明:
函数功能、入口及出口参数说明,函数调用关系描述等。
4、调试与测试:
包括调试方法,测试结果分析与讨论,测试过程中遇到的主要问题及采取的解决措施。
5、源程序清单和执行结果:
清单中应有足够的注释。
任课教师评语
成绩:
教师签名:
日期:
前言
摘要:
万年历是日常生活中不可或缺的小工具,用万年历我们可以准确地查到当前,以后或是过去的日期,极大地方便了我们的生活。
在万年历上添加了显示本地时间以后会更加准确地显示时间。
无论是对于我们学生还是上班族或是自由职业者需要经常查看和查找万年历来规划自己将要做得一些事情,或是回忆在过去的时间里已经做过的事情,使之更加有利于提升我们的学习或是工作进度。
系统功能结构图:
主要描述系统要实现的各个模块的功能。
一、系统模块设计
1.1需求分析
本程序的要求为:
1.使用图形用户界面
2.能够实现日期与星期的查询
3.能够显示农历
4.能够查看世界时间
5.能够添加闹钟
1.2开发和运行环境
开发工具:
Myeclipse
运行环境:
windows7
1.3功能设计
本程序要构建的万年历程序,其功能有以下几个方面:
(1)通过MainFrame类,实现图形界面和公历日期。
(2)提供年份、月份的下拉形式菜单来选择年份和月份。
(3)通过Lunar类实现农历日期。
(4)通过national类实现世界时间。
(5)能以月历形式显示日期与星期。
(6)通过SetClock类来实现闹钟功能。
(7)通过点击世界时间按钮查询世界时间
(8)通过点击闹钟按钮设置闹钟
(9)显示系统当前时间和日期。
(10)显示作者信息。
二、详细设计
2.1程序设计思路
1.总天数的算法:
首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。
然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
2.输出月份第一天为星期几的算法:
使总天数除以7取余加2得几既为星期几,若是7,则为星期日。
3.算出输出月份第一天为星期几的算法:
算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
4.如果年份小于1900年则程序不予判断。
2.2程序运行主界面
2.3流程图
三、部分功能实现及代码说明
MainFrame类
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.GridLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.ItemEvent;
importjava.awt.event.ItemListener;
importjava.text.SimpleDateFormat;
importjava.util.Calendar;
importjava.util.Date;
importjavax.swing.JButton;
importjavax.swing.JComboBox;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.Timer;
importaa.Lunar;
publicclassMainFrameextendsJFrameimplementsItemListener//建立主界面
{
JPanelpanel=newJPanel(newBorderLayout());//建立中层容器并布局
JPanelpanel1=newJPanel();
JPanelpanel2=newJPanel(newGridLayout(8,7));
JPanelpanel3=newJPanel(newGridLayout(4,1));
JLabel[]label=newJLabel[49];//标签
JLabely_label=newJLabel("年");
JLabelm_label=newJLabel("月");
JLabeldashao=newJLabel("时间总是在不经意间溜走,我们还得向前走",JLabel.CENTER);
JLabelbing=newJLabel("希望在回首时候,不带任何遗憾!
",JLabel.CENTER);
JLabelfeng=newJLabel("桂电大烧饼制作!
",JLabel.CENTER);
JLabellabelTime=newJLabel("",JLabel.CENTER);
JComboBoxcom1=newJComboBox();//下拉窗口
JComboBoxcom2=newJComboBox();
JButtonbut1=newJButton("闹钟");//按钮
JButtonbut2=newJButton("世界时间");
Calendarnow=Calendar.getInstance();
publicMainFrame()//设置主界面,并添加各组件
{
super("大烧饼万年历");
setSize(500,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel1.add(but1);
panel1.add(y_label);
panel1.add(com1);
panel1.add(m_label);
panel1.add(com2);
panel1.add(but2);
panel3.add(dashao);
panel3.add(bing);
panel3.add(feng);
panel3.add(labelTime);
for(inti=0;i<49;i++)//日期标签
{
label[i]=newJLabel("",JLabel.CENTER);
panel2.add(label[i]);
}
panel.add(panel1,BorderLayout.NORTH);//中层容器布局
panel.add(panel2,BorderLayout.CENTER);
panel.add(panel3,BorderLayout.SOUTH);
setContentPane(panel);
setVisible(true);
init();
com1.addItemListener(this);//对下拉组件监听
com2.addItemListener(this);
but1.addActionListener(newActionListener(){//按钮动作监听
publicvoidactionPerformed(ActionEvente){
newaa.SetClock();//闹钟类
}
});
but2.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
newaa.national();//世界时间类
}
});
Timertimer=newTimer(1000,newActionListener()//获得系统时间,并将其显示在主界面下方
{publicvoidactionPerformed(ActionEventevt)
{
Strings1=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss").format(newDate());
labelTime.setText("现在时间是:
"+s1);
}});
timer.start();//线程启动}
publicvoidinit()//设置日期标签函数
{
intyear,month,first_day_num;
Stringlog[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
for(inti=0;i<7;i++)
{
label[i].setText(log[i]);
}
for(inti=0;i<49;i=i+7)
{
label[i].setForeground(Color.red);//将星期天设置为红色
}
for(inti=6;i<49;i=i+7)
{
label[i].setForeground(Color.red);//将星期六设置为红色}
for(inti=1800;i<=2100;i++)//将年份的下拉设置为1800-2100年
{com1.addItem(""+i);}
for(inti=1;i<13;i++)//讲月份下拉设置为12月
{com2.addItem(""+i);}
first_day_num=(int)(now.get(Calendar.DAY_OF_WEEK));//获得日期
month=(int)(now.get(Calendar.MONTH));//获得月份
year=(int)(now.get(Calendar.YEAR));//获得年份
com1.setSelectedIndex(year-1800);//将年份设置为当前年份
com2.setSelectedIndex(month);//将月份设置为当前月
Resetday(first_day_num,year,month);//调用Resetday函数
}
publicintuse(intyear2,intmonth2)//use函数
{intfirst_day;
now.set(year2,month2,1);
first_day=(int)(now.get(Calendar.DAY_OF_WEEK));
returnfirst_day;}
publicvoidstateChanged(){
intyear3,month3,week3;
year3=Integer.parseInt(com1.getSelectedItem().toString());
month3=Integer.parseInt(com2.getSelectedItem().toString())-1;
week3=use(year3,month3);
Resetday(week3,year3,month3);//调用函}
publicvoidResetday(intweek_log,intyear_log,intmonth_log){//Resetday函数intmonth_day_score;//存储月份的天数
intcount;
Lunarlunar;//定义lunar
intmonth_day;
String[]LunarDate=newString[49];//农历标签
month_day_score=0;
count=1;
for(inti=0;i<49;i++){//将农历跟公历一起显示
for(intj=0;j<49;j=j+7)
{if(i!
=j&&i!
=j+6)
label[i].setForeground(Color.black);}
for(intj=0;i<49;i=i+7)
{label[i].setForeground(Color.red);}
for(intj=6;i<49;i=i+7){
label[i].setForeground(Color.red);
}}
Datedate=newDate(year_log,month_log+1,1);//nowMONTH是从0开始的,对于一月第几天来说,DAY_OF_MONTH第一天就是1.对于一年第几个月来说,MONTH一月份是0,二月份是1...
Calendarcal=Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH,-1);//前个月
month_day_score=cal.getActualMaximum(Calendar.DAY_OF_MONTH);//最后一天
month_day=month_day_score;
for(inti=7;i<49;i++){//初始化标签
label[i].setText("");
}
week_log=week_log+6;//将星期数加6,使显示正确
month_day_score=month_day_score+week_log;
lunar=newaa.Lunar();//调用Lunar类
for(inti=0;i{
LunarDate[i]=lunar.getLunarDate(year_log,month_log+1,i+1);//农历的实现
}
for(inti=week_log;iif(month_log==9&&count==1)
{
label[i].setText(count+"国庆");
label[i].setForeground(Color.red);
}
elseif(month_log==0&&count==1)
{
label[i].setText(count+"元旦");
label[i].setForeground(Color.red);
}
elseif(month_log==11&&count==24)
{
label[i].setText(count+"平安夜");
label[i].setForeground(Color.red);
}
elseif(month_log==11&&count==25)
{
label[i].setText(count+"圣诞");
label[i].setForeground(Color.red);
}
elseif(month_log==1&&count==14)
{
label[i].setText(count+"情人节");
label[i].setForeground(Color.red);
}
elseif(month_log==4&&count==1)
{
label[i].setText(count+"劳动节");
label[i].setForeground(Color.red);
}
elseif(LunarDate[i-week_log].equals("春节")||LunarDate[i-week_log].equals("元宵")||LunarDate[i-week_log].equals("端午")||LunarDate[i-week_log].equals("中秋"))
{
label[i].setText("\n"+count+LunarDate[i-week_log]);
label[i].setForeground(Color.red);
}
else
label[i].setText(count+LunarDate[i-week_log]);
}
}
publicvoiditemStateChanged(ItemEvente)
{
stateChanged();//调用函数
}
publicstaticvoidmain(String[]args)//主函数
{
newMainFrame();
}}
四、小结
(1)对于设计一个万年历图形界面程序,由于其功能简单设计也相对较易,通过设计这样的一个日历小组件,也能使自己对JAVA的一些基础知识掌握的更加牢固。
(2)对于本程序的设计,首先考虑其功能有哪些,需要显示什么,如何进行窗体构建布局,需要用哪些知识点,如相关的类和对象等。
最后,就是根据初步设计的功能和布局构架,考虑用源代码进行实现了。
经过了长时间的反复编写调试,课本和网上查阅相关资料相关文章,终于基本完成了整个课程设计,虽然还有些功能没有实现,但已经是我所能做到的最好的了。
在这个过程中,在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对JAVA语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。
自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。
通过这次课程设计,我明白了编写程序,不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。
还要熟悉常用的编程技巧和编程思想,不能只关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。
还有通过设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题。
总之,在通过真正动手之后,我java语言设计和有关它的操作方面都获益匪浅,但离真正的系统开发软件设计还是很有差别的,需要我们不断学习新的知识扩充自己才能做好这一工作。
学无止境,我们现在了解的东西还很少,更别说很好的掌握自己的专业知识,要谦虚的积极认真学习,不断的增强自身的能力提高个人素质,向一个真正的软件人发展。
五、参考文献
[1]耿祥义,张跃平.java面向对象程序设计.北京:
清华大学出版社
[2]《JAVA语言程序设计》清华大学出版社