该项目所有面板功能均实现。项目包结构:
目录
一.开发背景 2
二.系统分析 3
三.设计要求 7
四.总体设计 7
五.详细设计 10
(一)mainclass类
(二)CalendarPad类
(三)NotePad类
(四)Year类
(五)Month类
(六)CalendarImage类
(七)ClockDemo类
六. 系统打包与发布 66
七. 系统维护 67
一.开发背景
设计GUI界面的日历记事本。实现日历、记事本、校历显示、时钟、闹钟、整点报时、设置图片背景等功能,用户可以在任何日期记事或查看某个日期的记录,可以设置校历开始的时间、一学期校历的长度,、添加了数字时钟的功能。还有闹钟功能,可以设置闹钟时间,时钟有整点报时的功能。设置功能都会被记录,下次打开软件时还能保留先前的设置。
软件效果图:
二.系统分析
1.显示年、月、日
软件可以显示日历的年月日,并且对今天的日历给出了特殊的显示(大字体和青色显示)。还能查看当前时间之前和之后的日历,可以通过按钮操作,也支持在输入框里面输入年和月。如图:
2.校历功能
与一般的日历不同的是,本软件提供的日历能显示校历,特别适合于学生和老师的使用,而且可以自定义校历的开始时间和一学期校历的长度。随时可以更新,而且可以保存用户先前的设置和选择。对于不在校历显示方法为内的日期,用“无校历”标出。
3.日志功能
本日历软件还提供了写日志的功能,用户可以在右侧点击日历的日期,然后写下日志,并保存,也可以读取先前写下并保存的日志,还可以删除存储的日志。还能对用户的非法操作给予提醒,例如当用户在没有日志存储的日期点击删除日志时,软件就会弹出警告对话框。如图:
4.显示数字时钟功能
本软件提供了数字时钟的显示功能,能够准确地显示当前的时间,精确到秒。如图:
5.闹钟功能和整点报时功能
在时钟的基础上,本软件还添加了闹钟功能。用户可以自行设置闹钟的时间,而且每次设置时都会显示上次设置的闹钟时间,而且软件自己会记住当前设置的闹钟,即使关闭了软件再重新打开时,还能记住上次的设置。设置完闹钟时间后,当时间到达闹钟时间是,软件会发出铃声提醒用户。
另外,软件还具有整点报时的功能,当时间离整点还有10秒的时候。软件会自动报时,报时方式模仿电台。
6.日历图像显示功能
为了增加日历的外观效果,达到美化界面的目的,软件还能显示图片(在日历的正下方)。用户还可以通过设置选项,选择自己喜欢的图片显示在日历上。这也是个性化的体现,
(二)主要功能的实现方法
本软件虽然功能比较多,但实现方法都比较简单:
1.显示年、月、日
这应该是相对较难实现的一个功能,实现这个功能要求将一个容器分成7*7的小块,在上面7快添加表示星期的标题,下面7块用来表示日期。显示时,要获得显示月份的第一天星期几,再获得显示月份的天数,这样就可以从头到尾设置这个月显示内容了,没有显示内容的格子,将内容置为空。至于月份和年的显示相对简单,初始值为现在实际的年和月,以后的显示值跟随操作走就好了,而上、下年和上、下月按钮事件也是比较简单的。
2.校历功能
校历显示功能是这个软件设计的一大难点,从接受输入说起,当用户在点击菜单栏中的“设置校历初始状态”时,软件会把用户输入的信息存起来,再把最新输入的信息应用到校历显示中,更新校历。当用户第一次打开软件时,校历有一个默认值,一旦用户设置了校历信息,以后用户再打开软件时,软件会自动去对应文档里读取先前用户存储的信息,这样就使软件记住用户的设置了。这一点,在下面的闹钟设置,日历图片选择时都会用到。
至于显示校历,是这样的过程,先获取校历开始的日期和校历的长度。然后,对于日历当前的显示月份,计算这个月份之前的校历的周数,这个计算过程是重点也是难点,因为得判断一个月的第一周是新的一周还是上个月最后一周的延续,这就很多日期的处理。完成这个过程之后就可以实现对当前将要显示的月份的校历显示做处理了。最后再注意当前月份是否在校历范围内即可。
3.日志功能
日志功能也是一个重点,主要是创建一个文档,把用户的日志跟日期一一对应存到文档里面,以后的保存和删除都是在这个基础上实现的。显示日志时只要从存储的文档中判断有没有选择日期对应的日志,有的话把其显示在文字编辑框里面即可。按钮事件的监听也比较简单。
4.显示数字时钟功能
数字显示功能主要利用了多线程和组件重绘的方法实现的。在这里,创建一个时钟对象时,会产生一个新的线程,这个线程负责时间显示,每隔1秒钟会进行组件重绘,而重绘的结果就是时间显示增加一秒,这就是数字时钟显示的简单原理。
5.闹钟功能和整点报时功能
本功能是基于数字时钟功能的,每隔一秒,在组建重绘时,判断当前时间是否与闹钟时间相符或与整点报时时间相符,若是播放对应的音频即可,比较好实现。至于闹钟的设置,原理与校历初始状态的设置很相似,都是建一个文档把用户的设置存进去,操作时把它读出来。
6.日历图像显示功能
日历图像显示功能,也比较简单java中有现成方法可以调用显示图片,就是涉及IO流的一些东西,略感繁琐。对于选择显示的图片也很简单,就新建一个文件对话框,并且接受用户的输入,把用户的输入信息存到以文档中,以便记住用户的选择,这样子就把该显示的图片的路径获得,显示出来就比较容易了。
三.设计要求
1、系统界面的左侧是日历和图片显示区域。在日历区域,日历可以按年份前后翻动,鼠标单击“上年”按钮时,当前日历年份减一,显示上一年这个月份的日历;当鼠标左键单击“下年”按钮,当前日历年份加一,显示下一年这个月份的日历。日历也可以按月前后翻动,鼠标单击“上月”按钮时,显示上个月的日历(若是1月份,则显示上一年的12月份);鼠标单击“下月”按钮时,显示下个月的日历(若是12月份,则显示下一年的1月份)。在图片显示区域显示默认的或用户选择的图片。
2、系统界面的右侧是记事本和数字时钟。记事本的编辑区域上面显示日志对应的日期时间,编辑区域可供编辑和显示日志,编辑区域底下为按钮,点击“保存”按钮可以保存当前写的日志,点击“删除”按钮可以删除当前显示在编辑区域的日志。数字时钟显示区域用于显示当前的时间,能够具体到秒。
四.总体设计
在设计多功能日历时,需要编写7个java源文件:mainclass.java, mainclass.java, NotePad.java , Year.java, Month.java,CalendarImage.java ,ClockDemo.java。
这些类的主要功能如下:
主类 mainclass(用于启动程序)
主要框架mainclass(是程序的核心)
记事本NotePad(记事本功能)
年Year(显示年)
月Month(显示月份)
日历图像CalendarImage(显示日历图像)
数字时钟ClockDemo(用于显示数字时钟)
这些类的关系如下图所示:
各个类显示在效果图中,则如下图所示:
五.详细设计
(一)mainclass类
mainlclass主要用于启动整个软件,比较简单。生成一个日历的实例对象,将当前的日期时间传递给生成的一个CalendarPad对象;
代码(mainclass.java):
import java.util.Calendar;
//这是程序的主类;程序从这个类开始;
public class mainclass {
public mainclass() {
}
//main方法;
public static void main(String args[])
{
//创建一个日历的实例对象,用于返回当前时间;
Calendar calendar=Calendar.getInstance();
//得到当前时间;
int y=calendar.get(Calendar.YEAR);
int m=calendar.get(Calendar.MONTH)+1;
int d=calendar.get(Calendar.DAY_OF_MONTH);
//新建一个CalendarPad类的对象,把当前时间传递给它,几乎本程序的所用操作都从这里开始,是程序的最最核心部分;
new CalendarPad(y,m,d);
}
}
(二)CalendarPad类
1.效果图
CalendarPad新建的窗口效果如下:
其中菜单功也在这里实现,效果图如下:
对于菜单按钮的各项响应也在这个类实现,效果如下:
2.UML图
CalendarPad类是java.swing包中JFrame中的一个子类,并实现了MouseListener,ActionListener接口,表明该类的主要成员变量和方法的UML图如下图所示
CalendarPad |
|
int : year,month,day; int : ringhour,ringmin; int : day_of_the_week; int : beginyear,beginmonth, beginday,weeknum; String : picturename, weekDay[] JTextField :showDay[],showxiaoli[]; JPanel leftUp,rightUp,leftWhole, rightWhole,leftUp_center_west; Hashtable hashtable; |
File file; JLabel title[]; Calendar calendar; NotePad notepad Month showMonth; Year showYear; JMenuItem setxiaoli; CalendarImage calendarImage; ClockDemo clock; |
(构造函数)CalendarPad(); void getbeginmessage() String getPicture_address() void getsettingtime() void setschoolcalendar(int,int,int, int,int,int) Boolean after() int countweek(int,int) void setCalendar(int,int) void sortDay(int,int) |
int getYear() void setYear(int) int getMonth() void setMonth(int) int getDay() void setDay(int) Hashtable getHashtable() File getFile() void mousePressed(MouseEvent) voidactionPerformed(ActionEvent) |
以下是UML图中有关数据和方法的详细说明:
(A)成员变量:
(1)int year,month,day; 用于存储当前的时间,它们分别是确定年月日;
(2)int beginyear,beginmonth,beginday,weeknum;表示校历开始的年月日及周数,用于设置校历时获得对话框输入的内容;
(3)int ringhour,ringmin;表示闹钟时间的时和分;
(4)Hashtable hashtable; 一个哈希表对象,用于写日志时文件的IO流;
(5) File file;表示文件对象,用于写日志时文件的IO流;
(6) JTextField showDay[],showxiaoli[]; 前者是单行文本编辑区域数组,用于显示日期;也即是日历中每天号数显示的区域;后者用于显示校历的那一列区域;;
(7)String picturename;表示图像名称;
(8)String weekDay[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"}; 表示日历中的星期几,为显示内容;
(9)JLabel title[];标题栏,主要用于日历中星期几的标题栏;
(10)Calendar calendar; 表示日历对象;
(11)int day_of_the_week;表示具体的星期几;
(12)NotePad notepad表示记事本对象变量;
(13)Month showMonth; 表示显示月份的区域的组件对象(继承了Box)
(14)Year showYear; 表示显示年份的区域的组件对象(继承了Box)
(15) JMenuItem setxiaoli;表示 菜单里的设置校历的选项条;
(16)CalendarImage calendarImage;表示日历图像;
(17)JPanelleftUp,rightUp,leftWhole,rightWhole,leftUp_center_west;
表示显示在主界面的几个容器;具体含义参考源代码的注释;
(18)ClockDemo clock;表示时钟对象;
(B)方法:
(1)CalendarPad();是构造方法,用于创建窗口时的操作,是本类的一个核心部分;
(2)void getbeginmessage(),用于获得校历开始的时间及一学期的周数;
(3)String getPicture_address(),用于从文件中读到先前选择的显示图片的地址
(4)void getsettingtime(),用于得到闹钟时间,从文件中读到先前设置的闹钟时间;
(5)void setschoolcalendar(int,int,int,int,int,int) ,此方法用于设置校历栏的显示信息;
(6)Boolean after(),此方法用于判断当前时间是否在校历时间之后,若是返回true,否则为false;
(7)int countweek(int,int) ,此方法用于数i月份有几周(只横跨了几周,最小为5,最大为6);
(8)void setCalendar(int,int) ; 此方法用于设置日历牌,但只是起到对不同月份的分类而已,通过调用sortDay()方法,把每个格要显示几号的任务交给调用方法;
(9)void sortDay(int,int) ; 此方法供setCalendar()调用,用来设置每个格要显示几号;
(10)int getYear() ,用于给外部获取年;
(11)void setYear(int) 用于给外部设置年;
(12)int getMonth(),用于给外部得到月份;
(13)void setMonth(int) ,用于给外部设置月份;
(14)int getDay(),用于给外部得到号数;
(15)void setDay(int) ,用于给外部设置号数;
(16)Hashtable getHashtable(),用于给外部获得hashtable;
(17)File getFile(),用于给外部获得文件;
(18)void mousePressed(MouseEvent) ,鼠标监听器,按住鼠标的响应,为读取日志、写日志功能服务;
(19)voidactionPerformed(ActionEvent) ,事件监听器,用于处理菜单按钮的响应;