JAVA课程设计报告日历记事本.docx

上传人:b****7 文档编号:11156177 上传时间:2023-02-25 格式:DOCX 页数:22 大小:482.52KB
下载 相关 举报
JAVA课程设计报告日历记事本.docx_第1页
第1页 / 共22页
JAVA课程设计报告日历记事本.docx_第2页
第2页 / 共22页
JAVA课程设计报告日历记事本.docx_第3页
第3页 / 共22页
JAVA课程设计报告日历记事本.docx_第4页
第4页 / 共22页
JAVA课程设计报告日历记事本.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

JAVA课程设计报告日历记事本.docx

《JAVA课程设计报告日历记事本.docx》由会员分享,可在线阅读,更多相关《JAVA课程设计报告日历记事本.docx(22页珍藏版)》请在冰豆网上搜索。

JAVA课程设计报告日历记事本.docx

JAVA课程设计报告日历记事本

东华理工大学信息工程学院

《JAVA技术应用开发》

课程设计报告

日历记事本

 

姓名:

胡玖龙

学号:

************

同组成员:

完成日期:

2015.7.3

 

1.项目概述

日历记事本是将日历和记事本结合在一起,用户可以任意选择某一天,保存这一天需要记录的记事,或者任意查看某一天已经记录的记事。

同时还应具备提醒功能,当到达提醒时间时会自动弹出提醒。

 

2.需求分析

日历记事本大致分为日历和记事两个部分。

1日历部分

首先,需要选择日期,用户可以通过点击按钮选择前一年或后一年,同样也可以选择前一个月或后一个月,当月份为1月时,用户点击前一个月,会自动跳转到前一年的12月,同理,在12月时点击后一个月,会自动跳转到下一年的1月。

另外,当选择跨度比较大时,需要多次点击按钮,很不方便,所以需要一个下拉框,可以直接选择某一年或某一个月。

当用户改变选择日期时,日历会自动显示出这一个月的日历,并且可以通过点击某一天,来进行添加记事的操作,鼠标经过日历或点击日历时,会有不同的效果以提示用户这是可以点击的。

2记事部分

首先,需要一个文本域给用户编辑记事内容,记事和日历部分所选择的日期是相关的,当用户点击日历选择某一天,则记事本上端会显示出选择的日期信息。

同时,记事应该还具有设置提醒的功能,用户点击设置提醒按钮后,会弹出一个新的对话框,用来选择提醒时间。

为保存记事,应将记事以文件的形式存储在计算机上。

另外,当用户想查看所有记事,或者想搜索某一则记事时,可以将日历部分换成一个表格,列出所有的记事,或者符合搜索结果的记事。

 

3.概要设计

3.1功能结构

日历记事本以功能划分,大致分为日历、记事列表及记事本三个部分:

3.2布局

软件界面的大致布局如下图,可以通过点击按钮将日历切换为记事列表

 

日历/记事列表记事本

 

4.详细设计及功能实现

4.1结构

①类结构

类名

父类

说明

CalendarNotepad

JFrame

创建程序的总体界面,本身只有日期选择和显示当前日期等功能,以下3个类将作为JPanel在此类中实例化。

包含main方法,是程序执行的入口。

MyCalendar

JPanel

实现日历,可以根据选择的年份和月份显示出此月的日历,并能用鼠标点击选择对哪一天进行操作。

Notepad

JPanel

实现记事本,可以编辑和保存当天的记事,同时可以设置提醒时间。

NoteList

JPanel

实现记事列表,可以查看某一个月的记事或所有记事,也可以搜索记事。

 

②文件存储结构

程序第一次运行时,会在设定的位置自动创建路径:

“.../日历记事本/data/”。

例如默认会创建:

“E:

/日历记事本/data”。

每一则记事都会以txt文件的形式保存在data文件夹下,txt的文件名为记事的日期,例如“20150702.txt”保存的是2015年7月2日的记事资料,txt文件第一行记录是否有提醒时间,第二行为提醒时间(若无提醒则为空),第三行及以后为记事内容,具体保存格式见4.4记事本模块。

 

4.2主界面

1主要组件:

类型

名称

说明

JComboBox

yearComboBox

通过下拉列表选择年份

JComboBox

monthComboBox

通过下拉列表选择月份

JButton

previousYear

选择前一年

JButton

nextYear

选择后一年

JButton

previousMonth

选择前一月

JButton

nextMonth

选择后一月

JButton

currentBtn

返回当前日期

JButton

allNoteBtn

切换为显示记事列表或切换回日历

JLabel

currentTime

显示当前日期和时间

MyCalendar

leftPane

日历

Notepad

rightPane

记事本

NoteList

notePane

记事列表

 

2主要方法:

方法

返回类型

说明

getTime()

void

获取和显示当前时间,并和提醒时间比较

noteMark(intyear,intmonth)

void

检查本月中的每一天是否有记事,若有,则用不同颜色标记

setFilePath(Stringpath)

void

设置记事文件的保存路径

makeDir(Filedir)

void

创建文件路径

getAlarmList()

void

获取需要提醒的记事的提醒时间表

actionPerformed(ActionEvente)

void

实现各种按钮功能

main(String[]args)

void

主函数

 

3一些重要方法的实现:

makeDir(Filedir)

这个方法的功能是当路径不存在时创建文件路径,例如设置记事存储在E:

/日历记事本/data下,则掉用该方法后,会在E盘创建“日历记事本”文件夹,并在其中再创建“data”文件夹。

实现方法:

先获取父文件夹,若父文件夹不存在,则递归调用自身,获取父文件夹的父文件夹,直到父文件夹存在(根目录一般必定存在),若父路径存在,则在父路径下创建此文件夹。

流程图如下:

getAlarmList()

这个方法的功能是读取所有需要提醒的时间,将这些提醒时间按先后顺序存储在链表中。

实现方法:

先读取data中所有的txt文件的文件名以获取每一则记事的日期(txt文件的文件名就是日期信息),然后将日期作为参数,调用getAlarm()方法(在NoteList类中,下文4.5记事列表模块中会说明)获取提醒时间,然后再将日期和提醒时间一起存储在链表中,如2015年7月2日的记事的提醒时间为16:

30:

00,则该方法会将这些信息在链表中保存为“20150702163000”,这样做的原因以及提醒功能的具体运行方式见下文4.6提醒功能。

主界面完成后如下图:

(日历和记事本及记事列表是通过其他类实现的)

点击记事列表按钮后界面如下图:

4.3日历模块

①主要组件:

类型

名称

说明

JLabel[]

weeks

JLabel类数组,用来显示星期,一个7个

JLabel[]

days

JLabel类数组,用来显示日历,一个42个

②主要方法:

方法

返回类型

说明

howManyDays(intyear,intmonth)

int

返回此月有多少天

getWeek(intyear,intmonth,intday)

int

返回这个日期是星期几

getDays(intyear,intmonth)

String[]

返回此月天数的数组

③一些重要方法的实现:

howManyDays(intyear,intmonth)

这个方法是通过参数获取这个月有多少天,实现方法很简单,除了二月份,每个月的天数都是固定的,只要检查参数的年份是否是闰年,就可知道二月份的天数。

getWeek(intyear,intmonth,intday)

这个方法的作用是得到参数所写的日期是星期几,在程序中,最后一个参数一般都是1,因为这个方法主要用来获取某个月的第一天是星期几。

实现方法:

JAVA本身提供Calendar类,可以通过这个类自带的方法来获取某一天是星期几,但需要注意的是,得到的结果1-7表示星期天-星期一,也就是Calendar类默认一个星期是从星期天开始的。

为使程序符合中国人习惯,要先将结果转换为从星期一开始,例如用intweek保存结果,则只需要加一条语句:

week=week-1=0?

7:

week;

就可以将结果转换为从星期一开始。

howManyDays(intyear,intmonth)

从上面的组件表可知,不管这个月有多少天,都是先创建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记事本模块

①主要组件:

类型

名称

说明

JButton

save

保存记事

JButton

delete

删除记事

JButton

alarm

设置提醒

JTextArea

note

记事内容编辑区域

JLabel

noteDate

显示记事的日期

JLabel

noteWeek

显示记事的星期

AlarmDialog

alarmDialog

设置提醒时间,点击alarm按钮后弹出

②主要方法:

方法

返回类型

说明

saveNote(intyear,intmonth,intday)

void

保存记事及提醒

deleteNote(intyear,intmonth,intday)

void

删除记事及提醒

actionPerformed(ActionEvente)

void

实现按钮功能

③一些重要方法的实现:

saveNote(intyear,intmonth,intday)

这个方法的功能是保存记事及提醒时间(如果有提醒的话),不仅要将记事内容和提醒以txt文件形式保存,同时还要将提醒时间放在提醒时间链表的合适位置,此过程见4.6提醒功能。

实现方法:

先通过参数获得日期信息,因为参数为int型,而最后保存的txt文件名长度是固定的,所以当月和天小于10时,要在前面加0。

例如,2015年7月2日,应转换成20150702,再将文件内容保存为20150702.txt。

通过这条语句就可以完成:

StringfName=""+year+(month<10?

"0"+month:

month)+(day<10?

"0"+day:

day)+".txt";

另外,文件的内容不只包括记事内容,还有提醒时间,为了便于读取,都要按照同样的格式存储,例如2015年7月2日有一条记事,内容为“英语考试,记得带铅笔”,提醒时间为08:

00:

00。

则会按如下方式保存:

文件名:

20150702.txt

位置:

E:

/日历记事本/data/20150702.txt

内容:

Y

08:

00:

00

英语考试,记得带铅笔

 

文件的第一行为是否有提醒的标记,若有提醒则为“Y”,没有提醒则为“N”。

第二行为提醒时间,若没有提醒,则为空。

第三行及以后用来记录记事内容。

完成后如下图:

(不能单独存在,这是显示在主界面中的一部分)

左图为已存在记事时,右图为不存在记事时,下方按钮状态不同

 

点击设置提醒后,会弹出如下对话框:

设置提醒时间后,要点击右边的启用提醒后才能启用。

想取消提醒,只需要取消选择右边的启用提醒

 

4.5记事列表模块

①主要组件:

类型

名称

说明

JTable

noteTable

记事表格,以列表形式显示多则记事的日期、提醒和摘要

JLabel

noteListInfo

显示记事列表的信息

JTextField

searchField

搜索框,可以填入搜索词

JButton

search

根据搜索词搜索记事

JButton

allNote

切换查看所有记事,或切换回查看本月记事

②主要方法:

方法

返回类型

说明

getNoteInfo(intyear,intmonth,booleangetAll)

void

显示某月记事的列表,或显示全部记事的列表

getAlarm(intyear,intmonth,intday)

String

获取提醒

getSummary(intyear,intmonth,intday)

String

获取摘要

searchNote(Stringstr)

void

搜索记事

actionPerformed(ActionEvente)

void

实现按钮功能

3一些重要方法的实现:

getNoteInfo(intyear,intmonth,booleangetAll)

这个方法的左右是获取记事列表,然后显示在Jtable中。

方法的最后一个参数若为true,则获取所有记事,若为false,则只获取参数所指月份的记事。

实现方法,先根据参数,读取此月下的所有记事文件,然后将记事文件的文件名转换成“年-月-日”的形式填入列表中的日期列,再通过getAlarm()方法获取提醒,将提醒填入列表中的提醒列,再通过getSummary()方法获取摘要,将摘要填入列表中的摘要列。

例如例如2015年7月2日只有一条记事,内容为“英语考试,记得带铅笔”,提醒时间为08:

00:

00,则调用方法getNoteInfo(2015,7,false)后,记事列表会如图显示:

若调用getNoteInfo(2015,7,true),则会如图显示:

即使是显示全部记事,前两个日期参数也不能乱填,因为点击“查看本月”按钮后会返回显示参数所指月份的记事。

getAlarm(intyear,intmonth,intday)

这个方法的作用是获取提醒时间,若有提醒则返回提醒时间,若无提醒则返回“无”。

实现方法:

根据参数读取记事文件,然后读取文件的第一行,若第一行内容为“N”,则直接返回“无”,若第一行内容为“Y”,则返回文件第二行内容(即提醒时间)。

getSummary(intyear,intmonth,intday)

这个方法的作用是获取记事摘要。

实现方法:

根据参数读取记事文件,然后跳过文件前两行,直接从第三行开始读取文件内容,不论记事内容多长,都只读取30个字节,然后将读取内容返回。

searchNote(Stringstr)

这个方法的作用是通过参数获取搜索关键字段,搜索内容包含关键字段的记事。

实现方法:

先读取data文件夹下的所有记事文件的文件名,将文件名转换成int型的年、月、日,然后将其作为参数,调用getSummary()方法,通过String类自带的contains()方法判断getSummary()的返回的字符串是否包含关键字段,若包含,则将该记事的信息显示在记事列表中,并继续读取下一个记事文件。

 

4.6提醒功能

每一则记事都可以有提醒,而且提醒时间不仅包括时、分、秒这些时间信息,同时也包括日期信息。

提醒功能要做的就是,当提醒时间与计算机系统时间重合时,软件会自动弹出提醒信息。

而为了实时获取计算机系统的时间,至少每秒钟就要获取一次系统时间,而若每秒都将系统时间与所有提醒时间一一比较的话,将会耗费大量资源,软件将会变得没有效率。

为了解决这个问题,必须先将所有提醒时间按发生先后进行排序,这样就只需要与最先发生的提醒进行比较,当提醒已经发生时,则移除此提醒,后一个提醒将变为第一个,同时考虑到新增记事时,新的提醒时间要插入到合适位置,会将很多提醒移动,所以最好采用链表来存储提醒信息,这样可以方便的获取首元素,也可以方便的新增和删除元素。

具体实现:

为了方便排序和比较,设置链表元素类型为long型(若为Sting类型,则不能方便的进行大小比较),则链表定义如下:

LinkedListalarmLink=newLinkedList();

而元素值为“年月日时分秒”的形式,例如2015年7月2日8:

30:

00有一则提醒,则该提醒元素值为“20150702083000”,这样做的好处是,元素值的大小就代表了发生的先后,值越小,则越先发生。

例如20150702083000小于20150703070000,则2015年7月2日8:

30:

00的提醒要早于2015年7月3日7:

00:

00的提醒。

另外,并不是所有提醒时间都会加入链表中,若当前时间为7月2日,则7月1日的提醒是不会加入到链表中的。

执行流程:

先调用getAlarmList()方法读取所有已存在的提醒,并将其中晚于当前时间的提醒按先后顺序填入alarmLink中;若新增记事,则saveNote()方法会将新记事的提醒时间(若有提醒的话)插入到alarmLink中的合适位置;若删除记事,则deleteNote()方法会将删除的记事的提醒时间(若有提醒的话)从alarmLink中删除。

当链表读取完成后,只需要每秒钟将当前时间转换成“年月日时分秒”的形式,再与alarmLink.getFirst().longValue()比较,若相等,则自动弹出提醒框,并调用alarmLink.removeFirst()移除首元素。

下图表示一个新增提醒20150705103000应该插入的位置:

5.运行测试

第一次打开软件:

 

选择另一天:

添加一则记事,并设置提醒时间:

 

点击保存:

 

点击上方”记事列表“按钮:

 

再多添加几则记事:

 

搜索关键字”图书馆“:

 

当到达提醒时间:

6.总结

从选择题目到最后完成,一共花了一个多星期的时间,在这段时间中,我感觉自己的编程能力得到了很大的提升,以前一些不清楚的理论知识,也在实践中变得熟悉。

很多功能我并没有能第一时间想到实现的方法,但通过查API和查看其他项目源代码,最后都得到了解决,可以说,我分析和解决问题的能力也得到了提升。

在编程的过程中,我更加意识到代码规范的重要性,变量和方法如果随便命名,会给后续的编程造成很大的困难,一份好的代码,不仅仅是完成所需要的功能,可读性和可扩展性也非常重要。

最后的结果,基本上算是完成了需要的所有功能,但是还有很多地方做的不够好,如提醒功能,实际应用中,提醒时间没有必要精确到秒,而且提醒功能运行时可能会出现隐藏的bug,另外,提醒时,仅仅只是弹出一个简单的对话框,或许可以再加入播放铃声的功能。

另外,界面的交互性做的也不够好,布局也比较呆板,离一个真正能交给用户使用的软件还有很大的差距。

 

源代码:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1