日历小程序解读.docx
- 文档编号:26444746
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:18
- 大小:48.46KB
日历小程序解读.docx
《日历小程序解读.docx》由会员分享,可在线阅读,更多相关《日历小程序解读.docx(18页珍藏版)》请在冰豆网上搜索。
日历小程序解读
目录
一、摘要························1
二、程序分析······················1
2.1需求分析····················1
2.2功能设计····················1
2.3概要设计····················2-3
2.3.1程序设计思路················2
2.3.2具体功能设计················2
2.3.3程序流程图·················3
三、详细设计·····················4-12
3.1初始化组件····················4
3.2初始化程序数据,绘制程序面板··········4-7
3.3显示日期的方法·················8-11
3.4点击按钮产生的效果···············11-12
四、运行结果······················13
五、心得体会······················14
六、参考文献······················15
一、摘要:
万年历是一个强大的日历系统,通过它可以实现对过去,现在以及将来日期的查询,通过在年份对话框中输入要查询的年份,再相应的在月份对应的下拉菜单选择要查询的月份,则可得到相应的日历。
本实验是对图形用户界面,布局管理器的综合运用,理解JAVA的时间处理机制,编写独立运行的窗口。
2、程序分析
2.1需求分析
本程序的要求为:
1.使用图形用户界面;
2.本程序能够实现日期与星期的查询。
2.2功能设计
本程序要构建的万年历程序,其功能有以下几个方面:
1.实现图形界面。
2.能以月历形式显示日期与星期。
工作日、双休日、当天分别以黑色、红色和蓝色显示。
3.支持用户通过下拉形式菜单来选择月份。
4.通过点击“现在日期”来刷新日历。
2.3概要设计
2.3.1程序设计思路
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具体功能设计
数据选择列表:
年份选择列表、月份选择列表。
点击日期跳转按钮,即在日历中显示用户选择日期数据;
点击现在日期按钮,即在日历中显示当前日期数据。
2.3.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()的参数为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+"");
}
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());
setContentPane(pane_day);
setContentPane(pane_ym);
pane_parent.add(pane_day,BorderLayout.SOUTH);
pane_parent.add(pane_ym,BorderLayout.NORTH);
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();
}
intyear_sel=Integer.parseInt(year_int)-1900;
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;i if(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); } } 四、运行结果 五、心得体会 本次作业是对前面学过的所有面向对象的编程思想以及编程方法的一个总结、回顾和实践,因此,开始设计的时候要学会自己看书,明确本次作业设计所要用到的技术点并在网上搜索以及查阅相关的书籍来搜集资料。 也非常感谢这次实验让我学到了不少知识。 懂得了独立学习中非常重要的方法: 自己分析问题,并根据需要查资料,分析资料,真正达到学以致用的目的。 这学期的java程序设计是考查课,因此在平时上课时没有注意听讲,有很多东西在用的时候才发现不会应用,但是通过这次作业,我能够对java有大概的了解。 不能说两三个礼拜能把java弄懂弄透,但是会用java语言编一些简单的小程序还是有很大收获的。 在本次试验中主要还是回顾以前所学的编程语言中的循环和判断语句,而java的特别用处没有涉及太多,主要只是用了一些重要语句和主要结构。 Java和C++在程序结构上有少许不同,在运行环境下则是完全不一样。 Java需要配置变量和选取主类,这在之前都是没有接触过的。 Java给了我另一种编程的体会。 在今后的学习中,我会利用课余时间来更好的学习java,它现在是一门应用很广的编译语言,我会在不断练习中提高自己的编程能力,在大学为今后的工作打下坚实的基础。 六、参考文献 1: 《java2程序设计实用教程》(第二版) 电子工业出版社叶核亚编著 2: 《Java大学简明教程》 作者: (美)戴尔特 电子工业出版社译者: 张琛恩 附: 程序源代码 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(); 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); 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_jump); pane_ym.add(button_today); button_jump.addActionListener(this); button_today.addActionListener(this); pane_day.setLayout(newGridLayout(7,7)); for(inti=0;i<49;i++){ button_day[i]=newJButton(""); pane_day.add(button_day[i]); } this.setDay(); pane_parent.setLayout(newBorderLayout()); setContentPane(pane_day); setContentPane(pane_ym); pane_parent.add(pane_day,BorderLayout.SOUTH); pane_parent.add(pane_ym,BorderLayout.NORTH); setContentPane(pane_parent); pack(); show(); } voidsetDay(){ if(bool){ year_int=now_year+""; month_int=now_month; }else{ year_int=Year.getSelectedItem().toString(); month_int=Month.getSelectedIndex(); //year_int=Year.getText(); //month_int=Integer.parseInt(Month.getText()); } intyear_sel=Integer.parseInt(year_int)-1900; 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]); } 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(); intcount=1; for(inti=day_week;i if(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(Col
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 日历 程序 解读