JAVA课程设计报告日历记事本Word格式文档下载.docx
- 文档编号:7281382
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:22
- 大小:482.52KB
JAVA课程设计报告日历记事本Word格式文档下载.docx
《JAVA课程设计报告日历记事本Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《JAVA课程设计报告日历记事本Word格式文档下载.docx(22页珍藏版)》请在冰点文库上搜索。
3.1功能结构
日历记事本以功能划分,大致分为日历、记事列表及记事本三个部分:
3.2布局
软件界面的大致布局如下图,可以通过点击按钮将日历切换为记事列表
日历/记事列表记事本
4.详细设计及功能实现
4.1结构
①类结构
类名
父类
说明
CalendarNotepad
JFrame
创建程序的总体界面,本身只有日期选择和显示当前日期等功能,以下3个类将作为JPanel在此类中实例化。
包含main方法,是程序执行的入口。
MyCalendar
JPanel
实现日历,可以根据选择的年份和月份显示出此月的日历,并能用鼠标点击选择对哪一天进行操作。
Notepad
实现记事本,可以编辑和保存当天的记事,同时可以设置提醒时间。
NoteList
实现记事列表,可以查看某一个月的记事或所有记事,也可以搜索记事。
②文件存储结构
程序第一次运行时,会在设定的位置自动创建路径:
“.../日历记事本/data/”。
例如默认会创建:
“E:
/日历记事本/data”。
每一则记事都会以txt文件的形式保存在data文件夹下,txt的文件名为记事的日期,例如“20150702.txt”保存的是2015年7月2日的记事资料,txt文件第一行记录是否有提醒时间,第二行为提醒时间(若无提醒则为空),第三行及以后为记事内容,具体保存格式见4.4记事本模块。
4.2主界面
1主要组件:
类型
名称
JComboBox<
String>
yearComboBox
通过下拉列表选择年份
monthComboBox
通过下拉列表选择月份
JButton
previousYear
选择前一年
nextYear
选择后一年
previousMonth
选择前一月
nextMonth
选择后一月
currentBtn
返回当前日期
allNoteBtn
切换为显示记事列表或切换回日历
JLabel
currentTime
显示当前日期和时间
leftPane
日历
rightPane
记事本
notePane
记事列表
2主要方法:
方法
返回类型
getTime()
void
获取和显示当前时间,并和提醒时间比较
noteMark(intyear,intmonth)
检查本月中的每一天是否有记事,若有,则用不同颜色标记
setFilePath(Stringpath)
设置记事文件的保存路径
makeDir(Filedir)
创建文件路径
getAlarmList()
获取需要提醒的记事的提醒时间表
actionPerformed(ActionEvente)
实现各种按钮功能
main(String[]args)
主函数
3一些重要方法的实现:
这个方法的功能是当路径不存在时创建文件路径,例如设置记事存储在E:
/日历记事本/data下,则掉用该方法后,会在E盘创建“日历记事本”文件夹,并在其中再创建“data”文件夹。
实现方法:
先获取父文件夹,若父文件夹不存在,则递归调用自身,获取父文件夹的父文件夹,直到父文件夹存在(根目录一般必定存在),若父路径存在,则在父路径下创建此文件夹。
流程图如下:
这个方法的功能是读取所有需要提醒的时间,将这些提醒时间按先后顺序存储在链表中。
先读取data中所有的txt文件的文件名以获取每一则记事的日期(txt文件的文件名就是日期信息),然后将日期作为参数,调用getAlarm()方法(在NoteList类中,下文4.5记事列表模块中会说明)获取提醒时间,然后再将日期和提醒时间一起存储在链表中,如2015年7月2日的记事的提醒时间为16:
30:
00,则该方法会将这些信息在链表中保存为“20150702163000”,这样做的原因以及提醒功能的具体运行方式见下文4.6提醒功能。
主界面完成后如下图:
(日历和记事本及记事列表是通过其他类实现的)
点击记事列表按钮后界面如下图:
4.3日历模块
①主要组件:
JLabel[]
weeks
JLabel类数组,用来显示星期,一个7个
days
JLabel类数组,用来显示日历,一个42个
②主要方法:
howManyDays(intyear,intmonth)
int
返回此月有多少天
getWeek(intyear,intmonth,intday)
返回这个日期是星期几
getDays(intyear,intmonth)
String[]
返回此月天数的数组
③一些重要方法的实现:
这个方法是通过参数获取这个月有多少天,实现方法很简单,除了二月份,每个月的天数都是固定的,只要检查参数的年份是否是闰年,就可知道二月份的天数。
这个方法的作用是得到参数所写的日期是星期几,在程序中,最后一个参数一般都是1,因为这个方法主要用来获取某个月的第一天是星期几。
JAVA本身提供Calendar类,可以通过这个类自带的方法来获取某一天是星期几,但需要注意的是,得到的结果1-7表示星期天-星期一,也就是Calendar类默认一个星期是从星期天开始的。
为使程序符合中国人习惯,要先将结果转换为从星期一开始,例如用intweek保存结果,则只需要加一条语句:
week=week-1=0?
7:
week;
就可以将结果转换为从星期一开始。
从上面的组件表可知,不管这个月有多少天,都是先创建42个Jlabel,然后将日期填入其中,没有这一天则为空白,这个方法返回的String[]中的某项若为null,则没有这一天。
例如2015年7月,这个月的第一天是星期三,则第一天的前两个Jlabel内容为空。
这个方法返回的String[]长度为42不变,这样就可以很方便的将返回值依次填入42个Jlabel。
通过getWeek()方法获取这个月的第一天是星期几,然后再通过howManyDays()获取这个月有多少天,最后根据这两个数据在String[]中填入值并返回。
例如2015年7月,通过上面两个方法可知此月第一天是星期三,一共有31天,则返回值String[]dayNums为:
dayNums[]={null,null,”1”,”2”,”3”….”31”,null,...,null};
完成后如下图(不能单独存在,这是显示在主界面中的一部分):
4.4记事本模块
save
保存记事
delete
删除记事
alarm
设置提醒
JTextArea
note
记事内容编辑区域
noteDate
显示记事的日期
noteWeek
显示记事的星期
AlarmDialog
alarmDialog
设置提醒时间,点击alarm按钮后弹出
saveNote(intyear,intmonth,intday)
保存记事及提醒
deleteNote(intyear,intmonth,intday)
删除记事及提醒
实现按钮功能
这个方法的功能是保存记事及提醒时间(如果有提醒的话),不仅要将记事内容和提醒以txt文件形式保存,同时还要将提醒时间放在提醒时间链表的合适位置,此过程见4.6提醒功能。
先通过参数获得日期信息,因为参数为int型,而最后保存的txt文件名长度是固定的,所以当月和天小于10时,要在前面加0。
例如,2015年7月2日,应转换成20150702,再将文件内容保存为20150702.txt。
通过这条语句就可以完成:
StringfName="
"
+year+(month<
10?
0"
+month:
month)+(day<
+day:
day)+"
.txt"
;
另外,文件的内容不只包括记事内容,还有提醒时间,为了便于读取,都要按照同样的格式存储,例如2015年7月2日有一条记事,内容为“英语考试,记得带铅笔”,提醒时间为08:
00:
00。
则会按如下方式保存:
文件名:
20150702.txt
位置:
E:
/日历记事本/data/20150702.txt
内容:
Y
08:
00
英语考试,记得带铅笔
文件的第一行为是否有提醒的标记,若有提醒则为“Y”,没有提醒则为“N”。
第二行为提醒时间,若没有提醒,则为空。
第三行及以后用来记录记事内容。
完成后如下图:
(不能单独存在,这是显示在主界面中的一部分)
左图为已存在记事时,右图为不存在记事时,下方按钮状态不同
点击设置提醒后,会弹出如下对话框:
设置提醒时间后,要点击右边的启用提醒后才能启用。
想取消提醒,只需要取消选择右边的启用提醒
4.5记事列表模块
JTable
noteTable
记事表格,以列表形式显示多则记事的日期、提醒和摘要
noteListInfo
显示记事列表的信息
JTextField
searchField
搜索框,可以填入搜索词
search
根据搜索词搜索记事
allNote
切换查看所有记事,或切换回查看本月记事
getNoteInfo(intyear,intmonth,booleangetAll)
显示某月记事的列表,或显示全部记事的列表
getAlarm(intyear,intmonth,intday)
String
获取提醒
getSummary(intyear,intmonth,intday)
获取摘要
searchNote(Stringstr)
搜索记事
这个方法的左右是获取记事列表,然后显示在Jtable中。
方法的最后一个参数若为true,则获取所有记事,若为false,则只获取参数所指月份的记事。
实现方法,先根据参数,读取此月下的所有记事文件,然后将记事文件的文件名转换成“年-月-日”的形式填入列表中的日期列,再通过getAlarm()方法获取提醒,将提醒填入列表中的提醒列,再通过getSummary()方法获取摘要,将摘要填入列表中的摘要列。
例如例如2015年7月2日只有一条记事,内容为“英语考试,记得带铅笔”,提醒时间为08:
00,则调用方法getNoteInfo(2015,7,false)后,记事列表会如图显示:
若调用getNoteInfo(2015,7,true),则会如图显示:
即使是显示全部记事,前两个日期参数也不能乱填,因为点击“查看本月”按钮后会返回显示参数所指月份的记事。
这个方法的作用是获取提醒时间,若有提醒则返回提醒时间,若无提醒则返回“无”。
根据参数读取记事文件,然后读取文件的第一行,若第一行内容为“N”,则直接返回“无”,若第一行内容为“Y”,则返回文件第二行内容(即提醒时间)。
这个方法的作用是获取记事摘要。
根据参数读取记事文件,然后跳过文件前两行,直接从第三行开始读取文件内容,不论记事内容多长,都只读取30个字节,然后将读取内容返回。
这个方法的作用是通过参数获取搜索关键字段,搜索内容包含关键字段的记事。
先读取data文件夹下的所有记事文件的文件名,将文件名转换成int型的年、月、日,然后将其作为参数,调用getSummary()方法,通过String类自带的contains()方法判断getSummary()的返回的字符串是否包含关键字段,若包含,则将该记事的信息显示在记事列表中,并继续读取下一个记事文件。
4.6提醒功能
每一则记事都可以有提醒,而且提醒时间不仅包括时、分、秒这些时间信息,同时也包括日期信息。
提醒功能要做的就是,当提醒时间与计算机系统时间重合时,软件会自动弹出提醒信息。
而为了实时获取计算机系统的时间,至少每秒钟就要获取一次系统时间,而若每秒都将系统时间与所有提醒时间一一比较的话,将会耗费大量资源,软件将会变得没有效率。
为了解决这个问题,必须先将所有提醒时间按发生先后进行排序,这样就只需要与最先发生的提醒进行比较,当提醒已经发生时,则移除此提醒,后一个提醒将变为第一个,同时考虑到新增记事时,新的提醒时间要插入到合适位置,会将很多提醒移动,所以最好采用链表来存储提醒信息,这样可以方便的获取首元素,也可以方便的新增和删除元素。
具体实现:
为了方便排序和比较,设置链表元素类型为long型(若为Sting类型,则不能方便的进行大小比较),则链表定义如下:
LinkedList<
Long>
alarmLink=newLinkedList<
();
而元素值为“年月日时分秒”的形式,例如2015年7月2日8:
00有一则提醒,则该提醒元素值为“20150702083000”,这样做的好处是,元素值的大小就代表了发生的先后,值越小,则越先发生。
例如20150702083000小于20150703070000,则2015年7月2日8:
30:
00的提醒要早于2015年7月3日7:
00的提醒。
另外,并不是所有提醒时间都会加入链表中,若当前时间为7月2日,则7月1日的提醒是不会加入到链表中的。
执行流程:
先调用getAlarmList()方法读取所有已存在的提醒,并将其中晚于当前时间的提醒按先后顺序填入alarmLink中;
若新增记事,则saveNote()方法会将新记事的提醒时间(若有提醒的话)插入到alarmLink中的合适位置;
若删除记事,则deleteNote()方法会将删除的记事的提醒时间(若有提醒的话)从alarmLink中删除。
当链表读取完成后,只需要每秒钟将当前时间转换成“年月日时分秒”的形式,再与alarmLink.getFirst().longValue()比较,若相等,则自动弹出提醒框,并调用alarmLink.removeFirst()移除首元素。
下图表示一个新增提醒20150705103000应该插入的位置:
5.运行测试
第一次打开软件:
选择另一天:
添加一则记事,并设置提醒时间:
点击保存:
点击上方”记事列表“按钮:
再多添加几则记事:
搜索关键字”图书馆“:
当到达提醒时间:
6.总结
从选择题目到最后完成,一共花了一个多星期的时间,在这段时间中,我感觉自己的编程能力得到了很大的提升,以前一些不清楚的理论知识,也在实践中变得熟悉。
很多功能我并没有能第一时间想到实现的方法,但通过查API和查看其他项目源代码,最后都得到了解决,可以说,我分析和解决问题的能力也得到了提升。
在编程的过程中,我更加意识到代码规范的重要性,变量和方法如果随便命名,会给后续的编程造成很大的困难,一份好的代码,不仅仅是完成所需要的功能,可读性和可扩展性也非常重要。
最后的结果,基本上算是完成了需要的所有功能,但是还有很多地方做的不够好,如提醒功能,实际应用中,提醒时间没有必要精确到秒,而且提醒功能运行时可能会出现隐藏的bug,另外,提醒时,仅仅只是弹出一个简单的对话框,或许可以再加入播放铃声的功能。
另外,界面的交互性做的也不够好,布局也比较呆板,离一个真正能交给用户使用的软件还有很大的差距。
源代码:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 课程设计 报告 日历 记事本