资源描述
湖南农业大学课程论文
学 院:信息科学技术 班 级:08级信息工程2班
姓 名:郭显勇、刘彦波、任涛
学 号:41843227、41843228、41843219
课程论文题目: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日历小程序
学 生:郭显勇、刘彦波、任涛
湖南农业大学信息科学技术学院级信息工程2班
学号41843227、41843228、41843219
摘 要: 万年历是一个强大日历系统,经过它能够实现对过去,现在和未来日期查询,经过在年份对话框中输入要查询年份,再对应在月份对应下拉菜单选择要查询月份,则可得到对应日历。本试验是对图形用户界面,布局管理器综合利用,了解JAVA时间处理机制,编写独立运行窗口。
关键词: 日历;swing;布局管理器;
1需求分析
1.1需求分析
本程序要求为:
1.使用图形用户界面;
2.本程序能够实现日期和星期查询。
1.2功效设计
本程序要构建万年历程序,其功效有以下多个方面:
1.实现图形界面。
2.能以月历形式显示日期和星期。工作日、双休日、当日分别以黑色、红色和蓝色显示。
3.支持用户经过下拉形式菜单来选择月份。
4.经过点击“现在日期”来刷新日历。
2概要设计
2.1开发环境
开发平台:Microsoft Windows XP Professional Service Pack 2
开发工具:Eclipse SDK 3.2.0 + JDK 1.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. 假如年份小于大于2031年则程序不予判定。
2.3具体功效设计
数据选择列表:年份选择列表、月份选择列表。
点击日期跳转按钮,即在日历中显示用户选择日期数据;
点击现在日期按钮,即在日历中显示目前日期数据。
2.4程序运行界面
(图2.4.1:程序运行界面截图)
2.5程序步骤图
是
否
计算,绘制屏幕
是否选择日期
提交年月变更数据
程序初始化
结束
获取目前系统时间年份等数据
开始
(图2.5.1:程序步骤图)
3具体设计
3.1初始化组件
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
3.2初始化程序数据,绘制程序面板
在初始化模块中,首先定义一个公共类 CalenderTrain,它继承自JFrame。ActionListener是一个接口,在实现此接口类CalenderTrain中,给需要关注其动作组件跳转按钮button_jump和现在日期按钮button_today添加监听器(addActionListener(this),以后在事件处理方法public void actionPerformed (ActionEvent e) 中,对每个事件进行不一样处理。在这个类中,定义用到标签、下拉列表框、按钮,放置面板。
public class CalenderTrain extends JFrame implements ActionListener {
JComboBox Month = new JComboBox();
JComboBox Year = new JComboBox();
JLabel Year_l = new JLabel("年份:");
JLabel Month_l = new JLabel("月份:");
Date now_date = new Date();
JButton[] button_day = new JButton[49];
JButton button_jump = new JButton("日期跳转");
JButton button_today = new JButton("现在日期");
int now_year = now_date.getYear() + 1900;
int now_month = now_date.getMonth();
boolean bool = false;
String year_int = null;
int month_int;
JPanel pane_ym = new JPanel();
JPanel pane_day = new JPanel();
JPanel pane_parent = new JPanel();
调用CalenderTrain,设定面板标题为"JAVA日历程序"。只给窗口设置frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)话,点击关闭按钮,实施其实只有把窗口隐藏动作,在任务管理器中能够看到进程仍在运行。于是加上后面代码,确保点击关闭,程序直接退出system。面板大小设置为不能改变。
public CalenderTrain() {
super("JAVA日历程序");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClose(WindowEvent e) {
System.exit(0);
}
});
setResizable(false);
设定年月时,要求年份区间是目前年份过去到目前年份未来20年,月份区间为正常1-12月。因为在年份区间中,今年是全部年份中第十一个,所以Year.setSelectedIndex(){指定要选择列表项整数,其中 0 指定列表中第一项}参数为10时,年份刚好是。Pane_ym即放置年月下拉列表框和两个控制按钮面板。给“跳转按钮”和“现在日期”按钮添加监听事件。
for (int i = now_year - 10; i <= now_year + 20; i++) {
Year.addItem(i + "");
}
for (int i = 1; i < 13; i++) {
Month.addItem(i + "");//addItem(Object anObject)为项列表添加项。仅当 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(new GridLayout(7, 7));
for (int i = 0; i < 49; i++) {
button_day[i] = new JButton(" ");
pane_day.add(button_day[i]);
}
本程序中,对组件部署、整形和定位授权给一个布局管理器,由布局管理器来负责。利用布局管理器能够做到:(1)计算一个容器所选尺寸和最小尺寸(2)部署一个容器组件。这里采取是BorderLayout,按东南西北和中心将组件部署在容器四面和中心。用setContentPane()方法把容器置为JFrame内容面板。用pack()方法调整此窗口大小,以适合其子组件首选大小和布局实现全部显示,然后用show()方法显示出来。
pane_parent.setLayout(new BorderLayout());
//先把子容器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号格子,内容固定为星期序号,即“星期日”到“星期六”。
void setDay()
{
if (bool)
{
year_int = now_year + "";
month_int = now_month;
}
else
{
year_int = Year.getSelectedItem().toString();
month_int = Month.getSelectedIndex();//getSelectedIndex()指定目前选择列表项整数,其中 0 指定列表中第一项;假如没有选择任何项或目前所选项不在列表中,则返回 -1
}
int year_sel = Integer.parseInt(year_int) - 1900; //Integer结构一个新分配 Integer 对象,它表示 String 参数所指示 int 值。使用和 parseInt 方法(对基数为 10 值)相同方法将该字符串转换成 int 值。
Date dt = new Date(year_sel, month_int, 1);
GregorianCalendar cal = new GregorianCalendar(); cal.setTime(dt);
String week[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
int day = 0;
int day_week = 0;
for (int i = 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;
} else if (
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(当月总天数)。
int count = 1;
for (int i = day_week; i < day_week + day; count++, 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,得到今天日期,将月份置为目前月份,将年份置为目前年份。
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button_jump) {
bool = false;
this.setDay();
} else if (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(new WindowAdapter() {
public void windowClose(WindowEvent e) {
System.exit(0);
4.2下拉列表数据不能返回
运行程序,跳转日期后,再点击“目前日期”按钮,日期面板显示是目前日期数据,年份、月份下拉列表值还是停留在跳转时所选定值,不能正常返回。
(图4.2.1:下拉列表数据不能返回)
处理方法:把button_day处理事件,修改为下段代码
else if (e.getSource() == button_today) {
bool = true;
this.setDay();
Month.setSelectedIndex(now_month);
Year.setSelectedIndex(10);
}
5心得体会
经过短暂两周Java程序设计,使我又学到了很多知识,尤其是利用Java知识去处理实际问题能力又得到了很大提升。尽管所设计程序比较简单,不过程序中每个功效实现全部经过了自己一定认真思索。因为把所学知识做到很灵活利用在实际中,对于现在我还有一定难度,故而,在设计每个步骤中,全部会多多少少碰到部分问题,这就促进我去查阅多种资料,或请教同学,极大提升我专业素养,同时对在有些书上理论知识在实际利用,和应该注意问题有了比较深刻认识。当然,仍然有些理论问题不是很好去利用,或是了解不深刻。这就使在实践中所设计程序有些功效不是自己所想那样完美。不过,既然发觉了问题所在,我就不会放弃,直至问题得四处理。这些也同时反应出了平时利用知识去实践这方面做太少。太缺乏经验。对所设计中将所面临问题认识不够。是Java课程设计让我认识到了这些问题存在。同时给我提供了去面对这些问题平台。也使我充足认识到在以后也应该怎样去实践,怎样去学习一门计算机语言,和怎样去利用这门语言去处理实际问题等等。
总而言之,在经过这次Java课程设计,使我认识到了自己很多缺点,同时,也是我学到新知识和新方法一个机会。这给我在以后继续学习好这门语言指明了方向。
6参考文件
[1].曾令明 索 望 甘 刚 宋 波,Java程序设计教程,西安电子科技大学出版社,.8
[2].孙全党 王吴迪 赵枫朝,Java程序设计应用教程,电子工业出版社,.2
[3].赵玉阳,Java从入门到精通,清华大学出版社,.8
致 谢
本设计及汇报是在指导老师张老师指导下完成,所此在此衷心感谢张老师悉心教育和耐心讲解。同时还要感谢在设计程序和汇报期间给我帮助和启示同学,让我了解了很多自己没有注意或忽略地方,期望我们一起分享成功喜悦。
附:程序源代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class CalenderTrain extends JFrame implements ActionListener {
JComboBox Month = new JComboBox(); //月份下拉列表框
JComboBox Year = new JComboBox(); //年份下拉列表框
JLabel Year_l = new JLabel("年份:"); //定义标签
JLabel Month_l = new JLabel("月份:"); //定义标签
Date now_date = new Date(); //获取今天日期
JButton[] button_day = new JButton[49]; //定义一个数组用来存放日期
JButton button_jump = new JButton("日期跳转"); //现实选择日期
JButton button_today = new JButton("现在日期"); //显示今天日期按钮
int now_year = now_date.getYear() + 1900; //获取年份值
int now_month = now_date.getMonth(); //获取月份值(目前月份-1)
boolean bool = false;
String year_int = null; //存放年份
int month_int; //存放月份
JPanel pane_ym = new JPanel(); //放置下拉列表框和控制按钮面板
JPanel pane_day = new JPanel(); //放置日期面板
JPanel pane_parent = new JPanel(); //放置以上两个面板
//定义方法绘制面板
public CalenderTrain() {
super("JAVA日历程序"); //设定面板标题
//---以下几行使得关闭面板时退出程序
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClose(WindowEvent e) {
//System.out.print("CLOSING THE WIN");
System.exit(0);
}
});
setResizable(false); //面板大小不能改变
//设定年月
/*年份区间是目前年份过去到目前年份未来20年
* 月份正常1-12月
*/
for (int i = now_year - 10; i <= now_year + 20; i++) {
Year.addItem(i + "");
}
for (int i = 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(new GridLayout(7, 7));
for (int i = 0; i < 49; i++) {
button_day[i] = new JButton(" ");
pane_day.add(button_day[i]);
}
this.setDay(); //调用setDay()方法
pane_parent.setLayout(new BorderLayout()); //设定布局管理器
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();
}
//SET DAY 方法,显示日期
void setDay() {
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());
}
int year_sel = Integer.parseInt(year_int) - 1900; //取得年份值
Date dt = new Date(year_sel, month_int, 1); //结构一个日期
GregorianCalendar cal = new GregorianCalendar(); //创建一个Calendar实例
cal.setTime(dt);
String week[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
int day = 0; //day中存放某个月份天数
int day_week = 0; //用来存放某个月第一天是星期几数值
//--将星期添加到前7个按钮中
for (int i = 0; i < 7; i++) {
button_day[i].setText(week[i]);
}
//--
/*判定是几月份,依据它来设定day值
* 其中二月份要判定是否是闰年
*/
if (month_int == 0
|| month_int == 2
|| month_int == 4
|| month_int == 6
|| month_int == 7
|| month_int == 9
|| month_int == 11) {
day = 31;
} else if (
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();
int count = 1;
/*绘制按钮
*首先要依据选定月份第一天是星期几来确定我们绘制按钮起始位置
* 其中day_week就是我们要绘制起始位置
* 对于那些没有数值能够显示按钮要置空
*/
for (int i = day_week; i < day_week + day; count++, 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 + "");
}
}
}
//--对于没有日期数值显示按钮进行置空处理
if (day_week == 0) {
for (int i = day; i < 49; i++) {
button_day[i].setText(" ");
}
} else {
//第一天前面按钮置空
for (int i = 7; i < day_week; i++) {
button_day[i].setText(" ");
} //最终一天后面按钮置空
for (int i = day_week + day; i < 49; i++) {
button_day[i].setText(" ");
}
}
}
//点击按钮产生效果
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button_jump) {
bool = false;
this.setDay(); //假如点击跳转按钮就调用setDay()方法重新绘制按钮
} else if (e.getSource() == button_today) {
bool = true;
this.setDay(); //假如点击现在日期按钮,得到今天日期
Month.setSelectedIndex(now_month);//将月份置为目前月份
Year.setSelectedIndex(10); //将年份置为目前年份
}
}
public static void main(String[] args) {
CalenderTrain ct = new CalenderTrain();
}
}
展开阅读全文