java日历小程序课程设计.docx
《java日历小程序课程设计.docx》由会员分享,可在线阅读,更多相关《java日历小程序课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
![java日历小程序课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/9/eeddd635-0d41-427d-9081-744a168a1b80/eeddd635-0d41-427d-9081-744a168a1b801.gif)
java日历小程序课程设计
湖南农业大学课程论文
学院:
信息科学技术班级:
08级信息工程2班
姓名:
郭显勇、刘彦波、任涛
学号:
200841843227、200841843228、200841843219
课程论文题目:
JAVA日历小程序
课程名称:
Java程序设计(双语)
评阅成绩:
评阅意见:
成绩评定教师签名:
日期:
年月日
目录
摘要-1-
关键词-1-
1需求分析-1-
1.1需求分析-1-
1.2功能设计-1-
2概要设计-1-
2.1开发环境-1-
2.2程序设计思路-1-
2.3具体功能设计-2-
2.4程序运行界面-2-
2.5程序流程图-3-
3详细设计-3-
3.1初始化组件-3-
3.2初始化程序数据,绘制程序面板-3-
3.3显示日期的方法-6-
3.4点击按钮产生的效果-8-
4程序测试-9-
4.1程序不能完全退出-9-
4.2下拉列表数据不能返回-10-
5心得体会-10-
6参考文献-11-
致谢-11-
附:
程序源代码-12-
JAVA日历小程序
学生:
郭显勇、刘彦波、任涛
湖南农业大学信息科学技术学院2008级信息工程2班
学号200841843227、200841843228、200841843219
摘要:
万年历是一个强大的日历系统,通过它可以实现对过去,现在以及将来日期的查询,通过在年份对话框中输入要查询的年份,再相应的在月份对应的下拉菜单选择要查询的月份,则可得到相应的日历。
本实验是对图形用户界面,布局管理器的综合运用,理解JAVA的时间处理机制,编写独立运行的窗口。
关键词:
日历;swing;布局管理器;
1需求分析
1.1需求分析
本程序的要求为:
1.使用图形用户界面;
2.本程序能够实现日期与星期的查询。
1.2功能设计
本程序要构建的万年历程序,其功能有以下几个方面:
1.实现图形界面。
2.能以月历形式显示日期与星期。
工作日、双休日、当天分别以黑色、红色和蓝色显示。
3.支持用户通过下拉形式菜单来选择月份。
4.通过点击“现在日期”来刷新日历。
2概要设计
2.1开发环境
开发平台:
MicrosoftWindowsXPProfessionalServicePack2
开发工具:
EclipseSDK3.2.0+JDK1.6.0_02
2.2程序设计思路
1.月份总天数的算法:
直接根据month_int,即月份序号判断该月的天数。
当month_int等于2时,调用isLeapYear()方法判断是否为闰年。
2.网格内容算法:
用dt.getDate()方法算出输出月份第一天为星期几,第一天的格子序号应该为7+第一天的星期序号。
算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并从该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
3.日期颜色的算法:
格子数从0开始,第一行为星期序号,则日期从第7格开始。
根据格子序号i进行判断,当i模7余数为0或者6时日期为周末,置为红色;当i等于第一天的格子序号加上当前日期减一时,置为蓝色;其余日期为黑色。
4.如果年份小于2001年大于2031年则程序不予判断。
2.3具体功能设计
数据选择列表:
年份选择列表、月份选择列表。
点击日期跳转按钮,即在日历中显示用户选择日期数据;
点击现在日期按钮,即在日历中显示当前日期数据。
2.4程序运行界面
(图2.4.1:
程序运行界面截图)
2.5程序流程图
(图2.5.1:
程序流程图)
3详细设计
3.1初始化组件
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.util.*;
3.2初始化程序数据,绘制程序面板
在初始化模块中,首先定义一个公共类CalenderTrain,它继承自JFrame。
ActionListener是一个接口,在实现此接口的类CalenderTrain中,给需要关注其动作的组件跳转按钮button_jump和现在日期按钮button_today添加监听器(addActionListener(this),之后在事件处理方法publicvoidactionPerformed(ActionEvente)中,对每个事件进行不同处理。
在这个类中,定义用到的标签、下拉列表框、按钮,放置面板。
publicclassCalenderTrainextendsJFrameimplementsActionListener{
JComboBoxMonth=newJComboBox();
JComboBoxYear=newJComboBox();
JLabelYear_l=newJLabel("年份:
");
JLabelMonth_l=newJLabel("月份:
");
Datenow_date=newDate();
JButton[]button_day=newJButton[49];
JButtonbutton_jump=newJButton("日期跳转");
JButtonbutton_today=newJButton("现在日期");
intnow_year=now_date.getYear()+1900;
intnow_month=now_date.getMonth();
booleanbool=false;
Stringyear_int=null;
intmonth_int;
JPanelpane_ym=newJPanel();
JPanelpane_day=newJPanel();
JPanelpane_parent=newJPanel();
调用CalenderTrain,设定面板标题为"JAVA日历程序"。
只给窗口设置frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)的话,点击关闭按钮,执行的其实只有把窗口隐藏动作,在任务管理器中可以看到进程仍在运行。
于是加上后面的代码,确保点击关闭,程序直接退出system。
面板的大小设置为不能变化。
publicCalenderTrain(){
super("JAVA日历程序");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addWindowListener(newWindowAdapter(){
publicvoidwindowClose(WindowEvente){
System.exit(0);
}
});
setResizable(false);
设定年月时,规定年份的区间是当前年份的过去10年到当前年份的未来20年,月份区间为正常1-12月。
由于在年份区间中,今年是所有年份中的第十一个,所以Year.setSelectedIndex(){指定要选择的列表项的整数,其中0指定列表中的第一项}的参数为10时,年份刚好是2011。
Pane_ym即放置年月下拉列表框以及两个控制按钮的面板。
给“跳转按钮”和“现在日期”按钮添加监听事件。
for(inti=now_year-10;i<=now_year+20;i++){
Year.addItem(i+"");
}
for(inti=1;i<13;i++){
Month.addItem(i+"");//addItem(ObjectanObject)为项列表添加项。
仅当JComboBox使用可变数据模型时此方法才有效。
anObject-要添加到列表的Object
}
Year.setSelectedIndex(10);
button_jump.addActionListener(this);
button_today.addActionListener(this);
初始化日期按钮并绘制。
由于每一月第一天不能确定,即所在列的位置(星期)不能确定,加上第一行的星期序号,画一个7*7网格布局管理器GridLayout。
GridLayout把容器分成指定行和列的若干个网格,每个组件占一个网格,从左向右、从上到下依次把组件添加进来。
所有的网格都是同样大小的。
GridLayout(7,7)设置行列数为7*7。
pane_day.setLayout(newGridLayout(7,7));
for(inti=0;i<49;i++){
button_day[i]=newJButton("");
pane_day.add(button_day[i]);
}
本程序中,对组件的布置、整形和定位授权给一个布局管理器,由布局管理器来负责。
利用布局管理器可以做到:
(1)计算一个容器的所选尺寸和最小尺寸
(2)布置一个容器的组件。
这里采用的是BorderLayout,按东南西北和中心将组件布置在容器的四周和中心。
用setContentPane()方法把容器置为JFrame的内容面板。
用pack()方法调整此窗口的大小,以适合其子组件的首选大小和布局实现全部显示,然后用show()方法显示出来。
pane_parent.setLayout(newBorderLayout());
//先把子容器pane_parent设置为东南西北中
setContentPane(pane_day);
setContentPane(pane_ym);
pane_parent.add(pane_day,BorderLayout.SOUTH);
pane_parent.add(pane_ym,BorderLayout.NORTH);
//把内容面板添加到子容器pane_parent中
setContentPane(pane_parent);//把子容器添加到栏框中
pack();//调整此窗口的大小
show();
}
3.3显示日期的方法
根据bool的值,由if语句进行判断执行哪一显示日期的语句块,为true时,显示现在的时间;为false时,显示用户选定的时间。
网格第一行,即0至6号格子,内容固定为星期序号,即“星期日”到“星期六”。
voidsetDay()
{
if(bool)
{
year_int=now_year+"";
month_int=now_month;
}
else
{
year_int=Year.getSelectedItem().toString();
month_int=Month.getSelectedIndex();//getSelectedIndex()指定当前选择的列表项的整数,其中0指定列表中的第一项;如果没有选择任何项或者当前所选项不在列表中,则返回-1
}
intyear_sel=Integer.parseInt(year_int)-1900;//Integer构造一个新分配的Integer对象,它表示String参数所指示的int值。
使用与parseInt方法(对基数为10的值)相同的方式将该字符串转换成int值。
Datedt=newDate(year_sel,month_int,1);
GregorianCalendarcal=newGregorianCalendar();cal.setTime(dt);
Stringweek[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
intday=0;
intday_week=0;
for(inti=0;i<7;i++){
button_day[i].setText(week[i]);
}
判断当前月份的天数,根据它来设定day的值,其中二月份要判断是否是闰年。
因为第一行的星期序号已经占用了7个格子,所以day_week的值要加上7,即day_week=7+dt.getDay()。
if(month_int==0
||month_int==2
||month_int==4
||month_int==6
||month_int==7
||month_int==9
||month_int==11){
day=31;
}elseif(
month_int==3
||month_int==5
||month_int==8
||month_int==10){
day=30;
}else{
if(cal.isLeapYear(year_sel)){
day=29;
}else{
day=28;
}
}
day_week=7+dt.getDay();
绘制GridLayout网格的内容。
首先要根据选定的月份的第一天是星期几来确定我们绘制按钮的起始位置。
前段代码中的day_week就是我们要绘制的起始位置。
对于那些没有数值可以显示的按钮要置空。
星期六和星期日以红色字体显示,工作日以黑色字体显示,当天以蓝色字体显示。
对于没有日期数值显示的按钮进行置空处理。
Count的值即网格的内容,值从1一直到day(当月的总天数)。
intcount=1;
for(inti=day_week;iif(i%7==0
||i==13
||i==20
||i==27
||i==48
||i==34
||i==41)
{
if(i==day_week+now_date.getDate()-1)
{
button_day[i].setForeground(Color.blue);
button_day[i].setText(count+"");
}else{
button_day[i].setForeground(Color.red);
button_day[i].setText(count+"");
}
}
else
{
if(i==day_week+now_date.getDate()-1)
{
button_day[i].setForeground(Color.blue);
button_day[i].setText(count+"");
}else{
button_day[i].setForeground(Color.black);
button_day[i].setText(count+"");
}
}
}
3.4点击按钮产生的效果
对监听器关注的按钮动作进行处理,点击“日期跳转”按钮时,将bool置为false,并调用setDay()方法重新绘制网格内容;点击“现在日期”按钮时,将bool置为true,得到今天的日期,将月份置为当前月份,将年份置为当前年份。
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==button_jump){
bool=false;
this.setDay();
}elseif(e.getSource()==button_today){
bool=true;
this.setDay();
Month.setSelectedIndex(now_month);
Year.setSelectedIndex(10);
}
}
4程序测试
4.1程序不能完全退出
点击窗口右上角的关闭按钮,程序窗口消失,但是,查看任务管理器,可以发现进程仍然在运行。
(图4.1.1:
程序不能完全退出)
解决方法:
将关闭部分的代码修改为下段代码后,程序能够完全退出。
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addWindowListener(newWindowAdapter(){
publicvoidwindowClose(WindowEvente){
System.exit(0);
4.2下拉列表数据不能返回
运行程序,跳转日期后,再点击“当前日期”按钮,日期面板显示的是当前的日期数据,年份、月份下拉列表的值还是停留在跳转时所选定的值,不能正常返回。
(图4.2.1:
下拉列表数据不能返回)
解决方法:
把button_day的处理事件,修改为下段代码
elseif(e.getSource()==button_today){
bool=true;
this.setDay();
Month.setSelectedIndex(now_month);
Year.setSelectedIndex(10);
}
5心得体会
经过短暂的两周的Java程序设计,使我又学到了很多的知识,尤其是运用Java知识去解决实际问题的能力又得到了很大的提高。
尽管所设计的程序比较简单,但是程序中的每个功能的实现都经过了自己的一定认真的思考。
由于把所学的知识做到很灵活的运用在实际中,对于现在的我还有一定的难度,故而,在设计的每个的环节中,都会多多少少的遇到一些问题,这就促使我去查阅各种资料,或者请教同学,极大的提高我的专业素养,同时对在有些书上的理论知识在实际的运用,以及应该注意的问题有了比较深刻的认识。
当然,仍然有些理论问题不是很好的去运用,或者是了解的不深刻。
这就使的在实践中的所设计的程序有些功能不是自己所想的那样的完美。
不过,既然发现了问题的所在,我就不会放弃的,直至问题得到解决。
这些也同时反映出了平时运用知识去实践这方面做的太少。
太缺乏经验。
对所设计中将所面临的问题认识不够。
是Java课程设计让我认识到了这些问题的存在。
同时给我提供了去面对这些问题的平台。
也使我充分的认识到在以后也应该怎样去实践,怎样去学习一门计算机语言,以及如何去运用这门语言去解决实际问题等等。
总之,在经过这次Java的课程设计,使我认识到了自己很多的缺点,同时,也是我学到新知识和新方法的一个机会。
这给我在以后继续学习好这门语言指明了方向。
6参考文献
[1].曾令明索望甘刚宋波,Java程序设计教程,西安电子科技大学出版社,2007.8
[2].孙全党王吴迪赵枫朝,Java程序设计应用教程,电子工业出版社,2006.2
[3].赵玉阳,Java从入门到精通,清华大学出版社,2006.8
致谢
本设计及报告是在指导老师张老师的指导下完成的,所此在此衷心感谢张老师的悉心教诲以及耐心的讲解。
同时还要感谢在设计程序和报告期间给予我帮助和启示的同学,让我了解了很多自己没有注意或忽视的地方,希望我们一起分享成功的喜悦。
附:
程序源代码
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.util.*;
publicclassCalenderTrainextendsJFrameimplementsActionListener{
JComboBoxMonth=newJComboBox();//月份下拉列表框
JComboBoxYear=newJComboBox();//年份下拉列表框
JLabelYear_l=newJLabel("年份:
");//定义标签
JLabelMonth_l=newJLabel("月份:
");//定义标签
Datenow_date=newDate();//获取今天的日期
JButton[]button_day=newJButton[49];//定义一个数组用来存放日期
JButtonbutton_jump=newJButton("日期跳转");//现实选择日期
JButtonbutton_today=newJButton("现在日期");//显示今天日期按钮
intnow_year=now_date.getYear()+1900;//获取年份值
intnow_month=now_date.getMonth();//获取月份值(当前月份-1)
booleanbool=false;
Stringyear_int=null;//存放年份
intmonth_int;//存放月份
JPanelpane_ym=newJPanel();//放置下拉列表框和控制按钮面板
JPanelpane_day=newJPanel();//放置日期面板
JPanelpane_parent=newJPanel();//放置以上两个面板
//定义方法绘制面板
publicCalenderTrain(){
super("JAVA日历程序");//设定面板标题
//---以下几行使得关闭面板时退出程序
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addWindowListener(newWindowAdapter(){
publicvoidwindowClose(WindowEvente){
//System.out.print("CLOSINGTHEWIN");
System.exit(0);
}
});
setResizable(false);//面板的大小不能变化
//设定年月
/*年份的区间是当前年份的过去10年到当前年份的未来20年
*月份正常1-12月
*/
for(inti=now_year-10;i<=now_year+20;i++){
Year.addItem(i+"");
}
for(inti=1;i<13;i++){
Month.addItem(i+"");
}
Year.setSelectedIndex(10);//设定年份下拉列表为当前年份
//Year.setText()
pane_ym.add(Year_l);//添加年份标签
pane_ym.add(Year);//添加年份下拉列表框
Month.setSelectedIndex(now_month);//设定月份下拉列表为当前月份
pane_ym.add(Month_l);//添加月份标签
pane_ym.add(Month);//添加月份下拉列表框
pane_ym.add(button_