吉林工程技术师范学院.docx
《吉林工程技术师范学院.docx》由会员分享,可在线阅读,更多相关《吉林工程技术师范学院.docx(19页珍藏版)》请在冰豆网上搜索。
吉林工程技术师范学院
吉林工程技术师范学院
信息工程学院
《JAVA程序设计基础》
课程设计报告
题目:
万年历
专业:
软件工程
班级:
R1142
姓名:
郑佩
学号:
04
指导教师:
邱艳敏
时间:
2014.5.5-2014.5.16
摘要
万年历是一个强大的日历系统,通过它可以实现对过去,现在以及将来日期的查找,通过在年份对话框中输入要查询的年份,再相应的在月份对应的下拉菜单选择要查询的月份,则可得到相应的日历。
本实验是对图形用户界面,布局管理器的综合运用,理解JAVA的时间处理机制,编写独立运行的窗口。
本程序要构建的万年历程序,其功能有以下几个方面:
(1)通过网页形式运行,实现图形界面。
(2)能以月历形式显示日期与星期。
(3)支持用户自己输入年份,并提供月份的下拉形式菜单来选择月份。
(4)通过点击“更新”来刷新日历。
关键字:
日历系统图形用户界面JAVA
目录
一、课程设计的目的1
二、设计方案的论证(背景、意义、技术路线)2
三、设计实现过程3
3.1流程设计3
3.2主类设计:
4
3.3初始化数据:
4
3.4绘制程序界面:
5
四、调试运行及结果分析7
五、测试及问题探讨10
六、课设总结与体会11
七、致谢12
八、参考文献13
九、附录1
一、课程设计的目的
为了进一步巩固java程序设计课程所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了2周的Java程序设计课程设计。
通过此次课程设计,巩固所学java语言基本知识,增进Java语言编辑基本功,掌握JDK、Editplus、Eclipse、JCreator等开发工具的运用,拓宽常用类库的应用。
使学生通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,并且掌握书写程设计开发文档的能力,为今后从事实际工作打下坚实的基础。
课题选用综合类的应用系统为宜,可综合考查JAVA语言的编程知识和编程技巧,熟悉系统开发的基本流程,掌握系统开发的各个环节的要点。
学生可选择下面题目或者自定题目,但要求具有一定难度和复杂度,是一个较为完整的应用程序。
二、设计方案的论证(背景、意义、技术路线)
2.1背景
本程序的要求为:
1.使用图形用户界面;2.本程序能够实现日期与星期的查询。
3.随着科学技术的不断发展,计算机已经成为我们工作学习和生活中不可缺少的工具。
文本编辑器是个人计算机最司空见惯的应用程序了,在学习了Java语言之后,我决定使用Java语言编写一个简单的万年历,可以实现查询日期和显示时间的功能,满足日常基本的工作学习和娱乐需要。
2.2意义
万年历是日常生活中不可或缺的小工具,用万年历我们可以准确地查到当前,以后或是过去的日期,极大地方便了我们的生活。
在万年历上添加了显示本地时间以后会更加准确地显示时间。
无论是对于我们学生还是上班族或是自由职业者需要经常查看和查找万年历来规划自己将要做得一些事情,或是回忆在过去的时间里已经做过的事情,使之更加有利于提升我们的学习或是工作进度。
特别是现在,我们快要期末考试了,查看万年历的话将更加有助于我们的复习。
2.3技术路线
想要实现一个万年历的话,需要通过Swing图形用户界面程序设计来实现。
首先应该有一个大的框架来盛放这个万年历,本实验用面板panel来实现这个框架。
对它以边框布局(BorderLayout)形式进行布局,并在其中通过添加面板这种中间容器,即在面板中添加组件,然后将面板添加到框架中。
1.总天数的算法:
首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。
然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
2.输出月份第一天为星期几的算法:
使总天数除以7取余加2得几既为星期几,若是7,则为星期日。
3.算出输出月份第一天为星期几的算法:
算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
4.如果年份小于1582年则程序不予判断。
三、设计实现过程
3.1流程设计
图3.1系统流程图
3.2主类设计:
InputStream 最基本的输入流,提供了所有输入流都要用到的方法
OutputStream 最基本的输出流,提供了所有输出流都要用到的方法
PrintWriter 用于文本的打印输出
FileInputStream 处理简单的文件输入操作
FileOutputStream 处理简单的文件写入操作
File 文件名的代表
RandomAccessFile 提供了设置文件指针以及在DataInput和DataOutput接口中定义的方法
Serializable 类通过实现该接口来实现系列化
ObjectOutputStream 向流中写入任意类型的对象和任意基本类型的数据
ObjectInputStream 从流中读入任意类型的对象和任意基本类型的数据
3.3初始化数据:
publicclassCalendarAppletextendsApplet{
staticfinalintTOP=70;//顶端距离
staticfinalintCELLWIDTH=50,CELLHEIGHT=30;//单元格尺寸
staticfinalintMARGIN=3;//边界距离
staticfinalintFEBRUARY=1;
TextFieldtfYear=newTextField("2004",5);//显示年份的文本域
ChoicemonthChoice=newChoice();//月份选择下拉框
ButtonbtUpdate=newButton("更新");//更新按钮
GregorianCalendarcalendar=newGregorianCalendar();//日历对象
FontsmallFont=newFont("TimesRoman",Font.PLAIN,15);//显示小字体
FontbigFont=newFont("TimesRoman",Font.BOLD,50);//显示大字体
Stringdays[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
Stringmonths[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
intdaysInMonth[]={31,28,31,30,31,30,31,31,30,31,30,31};//每个月的天数
intsearchMonth,searchYear;//查询的年份及月份
3.4绘制程序界面:
publicvoidinit(){
setBackground(Color.white);//设置背景颜色
searchMonth=calendar.get(Calendar.MONTH);//得到系统年份
searchYear=calendar.get(Calendar.YEAR);//得到系统月份
add(newLabel("年:
"));//增加组件到Applet
tfYear.setText(String.valueOf(searchYear));//设置文本域文字
add(tfYear);
add(newLabel("月:
"));
monthChoice.setFont(smallFont);//设置月份选择下拉框的显示字体
for(inti=0;i<12;i++){
monthChoice.addItem(months[i]);//增加下拉框选项
}
monthChoice.select(searchMonth);//设置下拉框当前选择项
add(monthChoice);
add(btUpdate);
intcomponentCount=this.getComponentCount();//得到Applet中的组件数量
for(inti=0;igetComponent(i).setFont(smallFont);//设置所有组件的显示字体
}
}
四、调试运行及结果分析
在年份输入框内输入2012后点击查看后的情况:
图1在年份输入框里输入2012,刷新后的情况
月份下拉列表框:
图2月份下拉表框
选择月份后的情况:
图3选择月份后的情况
点击查看按钮后显示的结果:
图4点击查看按钮后的结果
五、测试及问题探讨
(1)选题目的:
本次课程设计为课本后设计题目任选一题进行设计。
思考一段时间后,我们组决定做一个万年历的设计。
主要考虑到以前时间少课程内容多,JAVA课程基础内容掌握并不是很抓实,而对于设计一个万年历程序,由于其功能简单设计也相对较易,对于我们组每个人的学习情况比较合适,并且通过设计这样的一个日历小组件,也能使自己对JAVA的一些基础知识掌握的更加牢固。
(2)对于本程序的设计,首先考虑其功能有哪些,需要显示什么,如何进行窗体构建布局,需要用哪些知识点,如相关的类和对象等。
最后,就是根据初步设计的功能和布局构架,考虑用源代码进行实现了。
经过了长时间的反复编写调试,课本和网上查阅相关资料相关文章,终于完成了整个课程设计。
在这个过程中,在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对JAVA语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。
自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。
六、课设总结与体会
经过了长时间的反复编写调试,课本和网上查阅相关资料相关文章,终于完成了整个课程设计。
在这个过程中,在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对JAVA语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。
自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。
通过这次课程设计,我明白了编写程序,不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。
还要熟悉常用的编程技巧和编程思想,不能只关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。
还有通过设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题。
所以网络这个强大的工具,确实是我们学习之中可以借助的一个很好的帮手。
网络是我们学习的最好的老师之一。
有问题,问网络,是一个很好的习惯。
七、致谢
在这次课程设计的撰写过程中,我得到了许多人的帮助。
首先我要感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。
在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。
其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计商的难题。
同时也感谢学院为我提供良好的做毕业设计的环境。
最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学。
八、参考文献
1.赵文靖编著,Java程序设计基础与上机指导,清华大学出版社
2.董迎红、王薇编著,Java程序设计案例教程与实训,北京大学出版社
3.赵文靖编著,《Java程序设计基础与上机指导》,清华大学出版社
4.杜佳荣等编著,Java网络编程技术与实践,清华大学出版社
5.苗春义,Java项目开发全程实录,清华大学出版社
九、附录
importjava.applet.Applet;
importjava.awt.*;
importjava.util.*;
publicclassCalendarAppletextendsApplet{
staticfinalintTOP=70;//顶端距离
staticfinalintCELLWIDTH=50,CELLHEIGHT=30;//单元格尺寸
staticfinalintMARGIN=5;//边界距离
staticfinalintFEBRUARY=1;
TextFieldtfYear=newTextField("2004",5);//显示年份的文本域
ChoicemonthChoice=newChoice();//月份选择下拉框
ButtonbtUpdate=newButton("查看");//更新按钮
GregorianCalendarcalendar=newGregorianCalendar();//日历对象
FontsmallFont=newFont("TimesRoman",Font.PLAIN,15);//显示小字体
FontbigFont=newFont("TimesRoman",Font.BOLD,50);//显示大字体
Stringdays[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
Stringmonths[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
intdaysInMonth[]={31,28,31,30,31,30,31,31,30,31,30,31};//每个月的天数
intsearchMonth,searchYear;//查询的年份及月份
publicvoidinit(){
setBackground(Color.yellow);//设置背景颜色
searchMonth=calendar.get(Calendar.MONTH);//得到系统年份
searchYear=calendar.get(Calendar.YEAR);//得到系统月份
add(newLabel("年:
"));//增加组件到Applet
tfYear.setText(String.valueOf(searchYear));//设置文本域文字
add(tfYear);
add(newLabel("月:
"));
monthChoice.setFont(smallFont);//设置月份选择下拉框的显示字体
for(inti=0;i<12;i++){
monthChoice.addItem(months[i]);//增加下拉框选项
}
monthChoice.select(searchMonth);//设置下拉框当前选择项
add(monthChoice);
add(btUpdate);
intcomponentCount=this.getComponentCount();//得到Applet中的组件数量
for(inti=0;igetComponent(i).setFont(smallFont);//设置所有组件的显示字体
}
}
publicvoidpaint(Graphicsg){
FontMetricsfontMetric;//显示字体的FontMetrics对象
intfontAscent;
intdayPos;
inttotalWidth,totalHeight;//总的宽度,高度
intnumRows;//行数
intxNum,yNum;//水平和垂直方向单元格数量
intnumDays;
StringdayStr;//显示天数字符串
intmargin;
g.setColor(Color.lightGray);//设置当前颜色
g.setFont(bigFont);//设置当前使用字体
g.drawString(searchYear+"年",60,TOP+70);//绘制字符串
g.drawString((searchMonth+1)+"月",200,TOP+130);
g.setColor(Color.black);
g.setFont(smallFont);
fontMetric=g.getFontMetrics();//获取变量初值
fontAscent=fontMetric.getAscent();
dayPos=TOP+fontAscent/2;
totalWidth=7*CELLWIDTH;//得到总的表格宽度
for(inti=0;i<7;i++){
g.drawString(days[i],(CELLWIDTH-fontMetric.stringWidth(days[i]))/2+i*CELLWIDTH,dayPos-20);//绘制表格标题栏
}
numRows=getNumberRows(searchYear,searchMonth);//计算需要的行的数量
totalHeight=numRows*CELLHEIGHT;//得到总的表格高度
for(inti=0;i<=totalWidth;i+=CELLWIDTH){
g.drawLine(i,TOP,i,TOP+totalHeight);//绘制表格线
}
for(inti=0,j=TOP;i<=numRows;i++,j+=CELLHEIGHT){
g.drawLine(0,j,totalWidth,j);//绘制表格线
}
xNum=(getFirstDayOfMonth(searchYear,searchMonth)+1)*CELLWIDTH-MARGIN;
yNum=TOP+MARGIN+fontAscent;
numDays=daysInMonth[searchMonth]+((calendar.isLeapYear(searchYear)&&(searchMonth==FEBRUARY))?
1:
0);
for(intday=1;day<=numDays;day++){
dayStr=Integer.toString(day);
g.drawString(dayStr,xNum-fontMetric.stringWidth(dayStr),yNum);//绘制字符串
xNum+=CELLWIDTH;
if(xNum>totalWidth){
xNum=CELLWIDTH-MARGIN;
yNum+=CELLHEIGHT;
}
}
}
publicbooleanaction(Evente,Objecto){
intsearchYearInt;
if(e.target==btUpdate){
searchMonth=monthChoice.getSelectedIndex();//得到查询月份
searchYearInt=Integer.parseInt(tfYear.getText(),10);//得到查询年份
if(searchYearInt>1581){
searchYear=searchYearInt;
}
repaint();//重绘屏幕
returntrue;
}
returnfalse;
}
privateintgetNumberRows(intyear,intmonth){//得到行数量
intfirstDay;
intnumCells;
if(year<1582){//年份小于1582年,则返回-1
return(-1);
}
if((month<0)||(month>11)){
return(-1);
}
firstDay=getFirstDayOfMonth(year,month);//计算月份的第一天
if((month==FEBRUARY)&&(firstDay==0)&&!
calendar.isLeapYear(year)){
return4;
}
numCells=firstDay+daysInMonth[month];
if((month==FEBRUARY)&&(calendar.isLeapYear(year))){
numCells++;
}
return((numCells<=35)?
5:
6);//返回行数
}
privateintgetFirstDayOfMonth(intyear,intmonth){//得到每月的第一天
intfirstDay;
inti;
if(year<1582){//年份小于1582年,返回-1
return(-1);
}
if((month<0)||(month>11)){//月份数错误,返回-1
return(-1);
}
firstDay=getFirstDayOfYear(year);//得到每年的第一天
for(i=0;ifirstDay+=daysIn