《JAVA课程设计报告-日历记事本(共20页).docx》由会员分享,可在线阅读,更多相关《JAVA课程设计报告-日历记事本(共20页).docx(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上东华理工大学信息工程学院JAVA技术应用开发课程设计报告日历记事本姓 名:胡玖龙学 号:2同组成员:无完成日期:2015.7.3目录1.项目概述日历记事本是将日历和记事本结合在一起,用户可以任意选择某一天,保存这一天需要记录的记事,或者任意查看某一天已经记录的记事。同时还应具备提醒功能,当到达提醒时间时会自动弹出提醒。2.需求分析日历记事本大致分为日历和记事两个部分。 日历部分首先,需要选择日期,用户可以通过点击按钮选择前一年或后一年,同样也可以选择前一个月或后一个月,当月份为1月时,用户点击前一个月,会自动跳转到前一年的12月,同理,在12月时点击后一个月,会自动跳
2、转到下一年的1月。另外,当选择跨度比较大时,需要多次点击按钮,很不方便,所以需要一个下拉框,可以直接选择某一年或某一个月。当用户改变选择日期时,日历会自动显示出这一个月的日历,并且可以通过点击某一天,来进行添加记事的操作,鼠标经过日历或点击日历时,会有不同的效果以提示用户这是可以点击的。 记事部分首先,需要一个文本域给用户编辑记事内容,记事和日历部分所选择的日期是相关的,当用户点击日历选择某一天,则记事本上端会显示出选择的日期信息。同时,记事应该还具有设置提醒的功能,用户点击设置提醒按钮后,会弹出一个新的对话框,用来选择提醒时间。为保存记事,应将记事以文件的形式存储在计算机上。另外,当用户想查
3、看所有记事,或者想搜索某一则记事时,可以将日历部分换成一个表格,列出所有的记事,或者符合搜索结果的记事。3.概要设计3.1功能结构日历记事本以功能划分,大致分为日历、记事列表及记事本三个部分:3.2布局软件界面的大致布局如下图,可以通过点击按钮将日历切换为记事列表 日期选择及其他操作 日历/记事列表 记事本4.详细设计及功能实现4.1结构类结构类名父类说明CalendarNotepadJFrame创建程序的总体界面,本身只有日期选择和显示当前日期等功能,以下3个类将作为JPanel在此类中实例化。包含main方法,是程序执行的入口。MyCalendarJPanel实现日历,可以根据选择的年份和
4、月份显示出此月的日历,并能用鼠标点击选择对哪一天进行操作。NotepadJPanel实现记事本,可以编辑和保存当天的记事,同时可以设置提醒时间。NoteListJPanel实现记事列表,可以查看某一个月的记事或所有记事,也可以搜索记事。 文件存储结构程序第一次运行时,会在设定的位置自动创建路径:“./日历记事本/data/” 。例如默认会创建:“E:/日历记事本/data”。每一则记事都会以txt文件的形式保存在data文件夹下,txt的文件名为记事的日期,例如“.txt”保存的是2015年7月2日的记事资料,txt文件第一行记录是否有提醒时间,第二行为提醒时间(若无提醒则为空),第三行及以后
5、为记事内容,具体保存格式见4.4记事本模块。4.2主界面 主要组件:类型名称说明JComboBoxyearComboBox通过下拉列表选择年份JComboBoxmonthComboBox通过下拉列表选择月份JButtonpreviousYear选择前一年JButtonnextYear选择后一年JButtonpreviousMonth选择前一月JButtonnextMonth选择后一月JButtoncurrentBtn返回当前日期JButtonallNoteBtn切换为显示记事列表或切换回日历JLabelcurrentTime显示当前日期和时间MyCalendarleftPane日历Notepa
6、drightPane记事本NoteListnotePane记事列表 主要方法:方法返回类型说明getTime()void获取和显示当前时间,并和提醒时间比较noteMark(int year,int month)void检查本月中的每一天是否有记事,若有,则用不同颜色标记setFilePath(String path)void设置记事文件的保存路径makeDir(File dir)void创建文件路径getAlarmList()void获取需要提醒的记事的提醒时间表actionPerformed(ActionEvent e)void实现各种按钮功能main(String args)void主函
7、数 一些重要方法的实现:makeDir(File dir)这个方法的功能是当路径不存在时创建文件路径,例如设置记事存储在E:/日历记事本/data下,则掉用该方法后,会在E盘创建“日历记事本”文件夹,并在其中再创建“data”文件夹。实现方法:先获取父文件夹,若父文件夹不存在,则递归调用自身,获取父文件夹的父文件夹,直到父文件夹存在(根目录一般必定存在),若父路径存在,则在父路径下创建此文件夹。流程图如下:getAlarmList()这个方法的功能是读取所有需要提醒的时间,将这些提醒时间按先后顺序存储在链表中。实现方法:先读取data中所有的txt文件的文件名以获取每一则记事的日期(txt文件
8、的文件名就是日期信息),然后将日期作为参数,调用getAlarm()方法(在NoteList类中,下文4.5记事列表模块中会说明)获取提醒时间,然后再将日期和提醒时间一起存储在链表中,如2015年7月2日的记事的提醒时间为16:30:00,则该方法会将这些信息在链表中保存为“000”,这样做的原因以及提醒功能的具体运行方式见下文4.6提醒功能。主界面完成后如下图:(日历和记事本及记事列表是通过其他类实现的)点击记事列表按钮后界面如下图:4.3日历模块主要组件:类型名称说明JLabelweeksJLabel类数组,用来显示星期,一个7个JLabeldaysJLabel类数组,用来显示日历,一个4
9、2个主要方法:方法返回类型说明howManyDays(int year,int month)int返回此月有多少天getWeek(int year,int month,int day)int返回这个日期是星期几getDays(int year,int month)String返回此月天数的数组一些重要方法的实现:howManyDays(int year,int month)这个方法是通过参数获取这个月有多少天,实现方法很简单,除了二月份,每个月的天数都是固定的,只要检查参数的年份是否是闰年,就可知道二月份的天数。getWeek(int year,int month,int day)这个方法的作
10、用是得到参数所写的日期是星期几,在程序中,最后一个参数一般都是1,因为这个方法主要用来获取某个月的第一天是星期几。实现方法:JAVA本身提供Calendar类,可以通过这个类自带的方法来获取某一天是星期几,但需要注意的是,得到的结果1-7表示星期天-星期一,也就是Calendar类默认一个星期是从星期天开始的。为使程序符合中国人习惯,要先将结果转换为从星期一开始,例如用int week保存结果,则只需要加一条语句:week=week-1=0?7:week;就可以将结果转换为从星期一开始。howManyDays(int year,int month)从上面的组件表可知,不管这个月有多少天,都是先
11、创建42个Jlabel,然后将日期填入其中,没有这一天则为空白,这个方法返回的String中的某项若为null,则没有这一天。例如2015年7月,这个月的第一天是星期三,则第一天的前两个Jlabel内容为空。这个方法返回的String长度为42不变,这样就可以很方便的将返回值依次填入42个Jlabel。实现方法:通过getWeek()方法获取这个月的第一天是星期几,然后再通过howManyDays()获取这个月有多少天,最后根据这两个数据在String中填入值并返回。例如2015年7月,通过上面两个方法可知此月第一天是星期三,一共有31天,则返回值String dayNums为:dayNums
12、 = null,null,”1”,”2”,”3”.”31”,null,.,null;完成后如下图(不能单独存在,这是显示在主界面中的一部分):4.4记事本模块主要组件:类型名称说明JButtonsave保存记事JButtondelete删除记事JButtonalarm设置提醒JTextAreanote记事内容编辑区域JLabelnoteDate显示记事的日期JLabelnoteWeek显示记事的星期AlarmDialogalarmDialog设置提醒时间,点击alarm按钮后弹出主要方法:方法返回类型说明saveNote(int year,int month,int day)void保存记事及
13、提醒deleteNote(int year,int month,int day)void删除记事及提醒actionPerformed(ActionEvent e)void实现按钮功能一些重要方法的实现:saveNote(int year,int month,int day)这个方法的功能是保存记事及提醒时间(如果有提醒的话),不仅要将记事内容和提醒以txt文件形式保存,同时还要将提醒时间放在提醒时间链表的合适位置,此过程见4.6提醒功能。实现方法:先通过参数获得日期信息,因为参数为int型,而最后保存的txt文件名长度是固定的,所以当月和天小于10时,要在前面加0。例如,2015年7月2日,应
14、转换成,再将文件内容保存为.txt。通过这条语句就可以完成:String fName = +year+(month10?0+month:month)+(day10?0+day:day)+ .txt;另外,文件的内容不只包括记事内容,还有提醒时间,为了便于读取,都要按照同样的格式存储,例如2015年7月2日有一条记事,内容为“英语考试,记得带铅笔”,提醒时间为08:00:00。则会按如下方式保存:文件名: .txt位置: E:/日历记事本/data/.txt内容:Y08:00:00英语考试,记得带铅笔文件的第一行为是否有提醒的标记,若有提醒则为“Y”,没有提醒则为“N”。第二行为提醒时间,若没有
15、提醒,则为空。第三行及以后用来记录记事内容。完成后如下图:(不能单独存在,这是显示在主界面中的一部分) 左图为已存在记事时,右图为不存在记事时,下方按钮状态不同点击设置提醒后,会弹出如下对话框:设置提醒时间后,要点击右边的启用提醒后才能启用。想取消提醒,只需要取消选择右边的启用提醒4.5记事列表模块主要组件:类型名称说明JTablenoteTable记事表格,以列表形式显示多则记事的日期、提醒和摘要JLabelnoteListInfo显示记事列表的信息JTextFieldsearchField搜索框,可以填入搜索词JButtonsearch根据搜索词搜索记事JButtonallNote切换查看
16、所有记事,或切换回查看本月记事主要方法:方法返回类型说明getNoteInfo(int year,int month,boolean getAll)void显示某月记事的列表,或显示全部记事的列表getAlarm(int year,int month,int day)String获取提醒getSummary(int year,int month,int day)String获取摘要searchNote(String str)void搜索记事actionPerformed(ActionEvent e)void实现按钮功能 一些重要方法的实现:getNoteInfo(int year,int mo
17、nth,boolean getAll)这个方法的左右是获取记事列表,然后显示在Jtable中。方法的最后一个参数若为true,则获取所有记事,若为false,则只获取参数所指月份的记事。实现方法,先根据参数,读取此月下的所有记事文件,然后将记事文件的文件名转换成“年-月-日”的形式填入列表中的日期列,再通过getAlarm()方法获取提醒,将提醒填入列表中的提醒列,再通过getSummary()方法获取摘要,将摘要填入列表中的摘要列。例如例如2015年7月2日只有一条记事,内容为“英语考试,记得带铅笔”,提醒时间为08:00:00,则调用方法getNoteInfo(2015,7,false)后
18、,记事列表会如图显示:若调用getNoteInfo(2015,7,true),则会如图显示:即使是显示全部记事,前两个日期参数也不能乱填,因为点击“查看本月”按钮后会返回显示参数所指月份的记事。getAlarm(int year,int month,int day)这个方法的作用是获取提醒时间,若有提醒则返回提醒时间,若无提醒则返回“无”。实现方法:根据参数读取记事文件,然后读取文件的第一行,若第一行内容为“N”,则直接返回“无”,若第一行内容为“Y”,则返回文件第二行内容(即提醒时间)。getSummary(int year,int month,int day)这个方法的作用是获取记事摘要。
19、实现方法:根据参数读取记事文件,然后跳过文件前两行,直接从第三行开始读取文件内容,不论记事内容多长,都只读取30个字节,然后将读取内容返回。searchNote(String str)这个方法的作用是通过参数获取搜索关键字段,搜索内容包含关键字段的记事。实现方法:先读取data文件夹下的所有记事文件的文件名,将文件名转换成int型的年、月、日,然后将其作为参数,调用getSummary()方法,通过String类自带的contains()方法判断getSummary()的返回的字符串是否包含关键字段,若包含,则将该记事的信息显示在记事列表中,并继续读取下一个记事文件。4.6提醒功能每一则记事都
20、可以有提醒,而且提醒时间不仅包括时、分、秒这些时间信息,同时也包括日期信息。提醒功能要做的就是,当提醒时间与计算机系统时间重合时,软件会自动弹出提醒信息。而为了实时获取计算机系统的时间,至少每秒钟就要获取一次系统时间,而若每秒都将系统时间与所有提醒时间一一比较的话,将会耗费大量资源,软件将会变得没有效率。为了解决这个问题,必须先将所有提醒时间按发生先后进行排序,这样就只需要与最先发生的提醒进行比较,当提醒已经发生时,则移除此提醒,后一个提醒将变为第一个,同时考虑到新增记事时,新的提醒时间要插入到合适位置,会将很多提醒移动,所以最好采用链表来存储提醒信息,这样可以方便的获取首元素,也可以方便的新
21、增和删除元素。具体实现:为了方便排序和比较,设置链表元素类型为long型(若为Sting类型,则不能方便的进行大小比较),则链表定义如下:LinkedList alarmLink = new LinkedList();而元素值为“年月日时分秒”的形式,例如2015年7月2日8:30:00有一则提醒,则该提醒元素值为“000”,这样做的好处是,元素值的大小就代表了发生的先后,值越小,则越先发生。例如000小于000,则2015年7月2日8:30:00的提醒要早于2015年7月3日7:00:00的提醒。另外,并不是所有提醒时间都会加入链表中,若当前时间为7月2日,则7月1日的提醒是不会加入到链表中
22、的。执行流程:先调用getAlarmList()方法读取所有已存在的提醒,并将其中晚于当前时间的提醒按先后顺序填入alarmLink中;若新增记事,则saveNote()方法会将新记事的提醒时间(若有提醒的话)插入到alarmLink中的合适位置;若删除记事,则deleteNote()方法会将删除的记事的提醒时间(若有提醒的话)从alarmLink中删除。当链表读取完成后,只需要每秒钟将当前时间转换成“年月日时分秒”的形式,再与alarmLink. getFirst().longValue()比较,若相等,则自动弹出提醒框,并调用alarmLink.removeFirst()移除首元素。下图表
23、示一个新增提醒000应该插入的位置:5.运行测试第一次打开软件:选择另一天:添加一则记事,并设置提醒时间:点击保存:点击上方”记事列表“按钮:再多添加几则记事:搜索关键字”图书馆“:当到达提醒时间:6.总结从选择题目到最后完成,一共花了一个多星期的时间,在这段时间中,我感觉自己的编程能力得到了很大的提升,以前一些不清楚的理论知识,也在实践中变得熟悉。很多功能我并没有能第一时间想到实现的方法,但通过查API和查看其他项目源代码,最后都得到了解决,可以说,我分析和解决问题的能力也得到了提升。在编程的过程中,我更加意识到代码规范的重要性,变量和方法如果随便命名,会给后续的编程造成很大的困难,一份好的代码,不仅仅是完成所需要的功能,可读性和可扩展性也非常重要。最后的结果,基本上算是完成了需要的所有功能,但是还有很多地方做的不够好,如提醒功能,实际应用中,提醒时间没有必要精确到秒,而且提醒功能运行时可能会出现隐藏的bug,另外,提醒时,仅仅只是弹出一个简单的对话框,或许可以再加入播放铃声的功能。另外,界面的交互性做的也不够好,布局也比较呆板,离一个真正能交给用户使用的软件还有很大的差距。源代码:专心-专注-专业
限制150内