面向对象设计
一、 设计目的 面向对象程序设计是学习完《Java 6 程序设计》课程之后,进行的一次全面的综合性练习,是学习完理论课程之后的必要的集中实践环节。面向对象程序设计的课程设计的目的在于是提高学生对所学知识综合应用能力的一种方式,要求我们对理论课中所学习到的知识综合运用,实现有一定规模的Java应用。此次课程设计也为我们将来的毕业设计和具体工作实践奠定了坚实的基础。 二、设计任务 Java日历设计一个java日历,要求用java编写简单日历,只需要输入年、月就可打印出对应月的日历。要求有简单的用户界面。 三、概念设计 系统功能图 该系统主要实现的功能如图一所示:
图一 1、当用户需要查询指定年月的日历时,用户将选择框内年月改变,系统获取信息并设置月历,具体流程如图二所示:
图二
2、用户用鼠标点击选择一个日期后,系统可用蓝色方框框住该日期,表示系统已选择该日,具体流程如图三所示:
图三 需求分析 对于万年历系统,其主要功能是:查看当日日期(年、月、日)、查看当时时间、查看其他年月的月历、对选中的日期进行标识。主要使用流程是:查看万年历系统,查看其他月份或年份日历,选中其他日期查看,查看当日日期。主要功能的用例描述如下: (1)查看万年历 1、进入万年历系统; 2、系统获取当日日期并设置日历为当月,蓝框选中当日日期; (2)查询当月其他年份 改变年份有两张方法,一种是选择年份,一种是摁按键选择上一年或下一年。 下拉菜单选择年份: 1、点击选择年份的下拉菜单,选择年份; 2、系统获取已选择的年份; 3、系统设置为已选年份当月的月历并显示在界面显示。 按键选择上一年(或下一年): 1、点击选择“年—”(或“年+”)的按键; 2、系统获取选择框内的年份; 3、将系统获取年份的数字减去1(或加上1); 4、将选择框内的年份设为已更改的年份; 5、系统设置为已更改年份当月的月历并显示在界面显示。 (3)查询当年的其他月份 改变月份有两张方法,一种是选择月份,一种是摁按键选择上一月或下一月。 下拉菜单选择月份: 1、点击选择月份的下拉菜单,选择年份; 2、系统获取已选择的月份; 3、系统设置已选月份为当年的月历并在界面显示。 按键选择上一月(或下一月): 1、点击选择“月—”(或“月+”)的按键,; 2、系统获取选择框内的月份; 3、将系统获取月份的数字减去1(或加上1); 4、将选择框内的月份设为已更改的月份; 5、系统设置为已更改月份当年的月历并在界面显示。 (4)选择其他日期查看 1、点击其他日期; 2、系统对所有日期的label进行监听,判断点击的那个label; 3、返回被点击的label的数组下标; 4、对该下标的label设置蓝色边框,表示选中。 (5)查看当日日期 1、点击“今日”按键; 2、系统获取今日日期; 3、设置年份和月份选择框为当日年月; 4、系统设置为当日年月的月历并在界面显示; 5、判断当日日期在哪个label上; 6、返回被点击的label的数组下标; 7、对该下标的label设置蓝色边框,表示选中。 设计思路 本课程设界面由两个模块构成,主要有表头模块和日历模块两部分。
(1)表头模块上有查询输入部分和时间显示部分: 1、两个下拉列表用于选择的年份和月份,如改变年份后系统用getShowYear()获得组合框中的中文年份,getCombYear()转换成英文格式,得到用户选择的年份,同时用getMonthDays()和getInitWeek()得到界面的设定,最终,用setDays()设置出用户所要求的月历,改变月份同理; 2、四个button按钮用于实现年—、年+、月—、月+,如选择了“年+”后,系统用getShowYear()和getCombYear()获得组合框中的年份,在其年份上加1,将改变的年份显示在组合框里,计算出该年月日历的安排,并用setDays()设置出用户所要求得月历,其他按钮同理; 3、一个button按钮用于实现对今日日期的查找,当用户选择了“今日”后,系统用getNowYear()和getNowMonth()得到当日年月,并调用setNowDay()将系统组合框内年月设为当日年月,显示当月月历,同时系统用getNowDay()获得当日日期,用labelDay[i].setBorder(border1)语句将当日的日期用蓝色的边框框住表示选定; 4、创建一个标签用于显示时间,监听系统时间并显示。
(2)日历模块上添加系统的结果显示部分: 1、该部分最初显示为当日年月的月历,改变年月后,获得需要显示的月份天数m和当月1号是从labelDay[n]开始后按顺序从添加到labelDay[m+n],遇到周末用setForeground(Color.red)设定字体显示为红色; 2、对labelDay标签进行监听,如果鼠标点击某个label,判断该标签的的序号,用setBorder()为该label设置蓝色边框并用setBordr(null)将上一个边框清除。
类设计 本程序创建了一个AidyCalender类,该类包括了改变年月对月历界面显示的改变和时间的显示,主要包括函数如表1所示: 表-1 AidyCalender
界面设计 界面该界面由上表头模块输入选择部分和中央的结果显示部分组成。输入部分创建两个下拉列表选择年月及5个功能按键用于实现日历的基本操作;结果显示部分根据该月1号所属星期和该月的天数设置出该月月历界面。
主要的界面设置代码如下: ————————————加上星期日到六————————————— for(int i=0;i<7;i++) { labelWeek[i] = new JLabel(); labelWeek[i].setHorizontalAlignment(0); if(i==0||i==6) { labelWeek[i].setForeground(Color.red); //设置周末为红色 labelWeek[i].setFont(new Font("新宋体",Font.BOLD,18)); } else { labelWeek[i].setForeground(Color.BLACK); labelWeek[i].setFont(new Font("新宋体",Font.PLAIN,18)); } labelWeek[i].setText(stringWeekCn[i]); panel2.add(labelWeek[i]); }
————————————加上日期的label————————————— for(int i= 0;i<42;i++) { labelDay[i] = new JLabel(); labelDay[i].setHorizontalAlignment(0); //设置文本的水平对齐方式 labelDay[i].setText(""); panel2.add(labelDay[i]); labelDay[i].addMouseListener(listener); //对label进行监听 }
————————————设置月历———————————————— public void setDays(int monthDays,int initWeek,int day) { setDateNull(); for(int i=initWeek;i<initWeek+monthDays+1;i++) //initWeek 初始星期 { labelDay[i].setFont(new Font("黑体",Font.BOLD,18)); //设置日期的字体 if((i-initWeek+1)==day) //如果日期为今天 { for(int j=0;j<42;j++) labelDay[j].setBorder(null); labelDay[i].setBorder(border1); //选中当日日期 } if((i%7==0)||(i%7==6)) labelDay[i].setForeground(Color.red); else labelDay[i].setForeground(Color.BLACK); labelDay[i].setText(String.valueOf(i-initWeek+1)); } for(int i=initWeek+monthDays;i<42;i++) labelDay[i].setText(""); }
4.2.3功能实现 1、实现指定年月查询的主要代码如下:
———————————获取组合框中的年份和月份————————— public int getComboYear() { return combo1.getSelectedIndex()+1; }
public int getComboMonth() { return combo2.getSelectedIndex(); }
—————————返回当月中的1号是从星期几开始———————— public int getInitWeek(String initWeek) { int nowWeek = 0 ; //nowWeek系统日期中的星期 for(int i = 0;i<7;i++) { if(initWeek.equalsIgnoreCase(stringWeekEn[i])) { nowWeek = i; break; } } return nowWeek; } ——————————————返回所选年月的天数—————————————— public int getMonthDays(int year, int month) { switch (month) { case 3: case 5: case 8: case 10:return 30;//小月返回30天 case 1: if (gregorianCalendar.isLeapYear(year)) //isLeapYear(year)确定当前纪元中的指定年份是否为闰年。 return 29; else return 28; //闰年的二月返回29天,平年返回28天 default:return 31; //大月返回31天 } }
———————————————设置月历————————————————— public void setDays(int monthDays,int initWeek,int day) { setDateNull(); for(int i=initWeek;i<initWeek+monthDays+1;i++) //initWeek 初始星期 { labelDay[i].setFont(new Font("黑体",Font.BOLD,18)); //设置日期的字体 if((i-initWeek+1)==day) //如果日期为今天 { for(int j=0;j<42;j++); labelDay[j].setBorder(null); labelDay[i].setBorder(border1); //选中当日日期 } if((i%7==0)||(i%7==6)) labelDay[i].setForeground(Color.red); else labelDay[i].setForeground(Color.BLACK); labelDay[i].setText(String.valueOf(i-initWeek+1)); } for(int i=initWeek+monthDays;i<42;i++) labelDay[i].setText(""); } 2、实现选择日期功能的主要代码如下:
—————————————设置蓝色边框————————————— private Border border = BorderFactory.createRaisedBevelBorder(); private Border border1 = BorderFactory.createLineBorder(Color.cyan,8); //蓝色选择边框
————————判断点击了哪个label,然后做相应的响应—————— MouseListener listener = new MouseAdapter() { public void mouseClicked(MouseEvent e) { for(int j=0;j<42;j++) { labelDay[j].setBorder(null); if((JLabel)e.getSource()==labelDay[j]) labelDay[j].setBorder(border1); } } };
|