1、.摘 要Java是Sun公司推出的一种基于面向对象技术的编程语言,同时也是一种跨 平台的程序设计语言,是软件开发的一种革命性技术,已被列为当今世界信息技术的主流之一,Java语言是面向对象编程,并涉及到网络、多线程等重要的基础知识,因此Java语言也是学习面向对象编程和网络编程的首选语言。Java 有许多值得称道的优点,如简单、面向对象、分布式、解释性、可靠、安全、结构中立性、可移植性、高性能、多线程、动态性等。用JAVA 语言进行程序开发,目前十分流行。本设计通过 JAVA 来实现具有图形界面的日历记事本,体现了 JAVA 的高效性等特点。随着社会的发展,越来越多的人依靠电子产品生活,而他们
2、的日常工作也是离不开这些电子产品的,所以开发出一款日历备忘录就显得必不可少了。利用面向对象的程序设计语言Java来实现具有图形界面的日历记事本。日历具有基本的浏览和日期修改的功能。记事本具有输入、保存、删除、查看等基本功能。关键词:面向对象 Java 日历 记事本目 录摘 要I目 录II第1章 绪论31.1 概 述31.2 课程设计题目31.3 课程设计目的31.4 课程设计内容3 1.5 项目背景和目标3第2章 系统需求分析52.1 系统目标52.2 主体功能52.3 开发环境5第3章 系统概要设计63.1 系统的功能模块划分63.2 系统流程6第4章 系统详细设计84.1 程序变量和方法8
3、第5章 算法描述和编码实现105.1 类的算法105.2 编码实现11第6章 测试14 6.1 测试方案14 6.2 测试结果14总结18参考文献19附录20 第1章 绪论1.1 概 述 日历记事本的包括日历和日志记事本两部分:日历部分采用公历历法,界面设计:日期部分每行7天,每列 5天,可完全 记录一个月中的所有天数。星期采用中文显示,每行的第一天为星期日。星期六显示为蓝色,星期日显示为红色,当前日期显示为绿色,其它日期显示为黑色。年份通过负数表示公元前,正数表示公元后。用户可通过使用鼠标点击按钮的方式改变日历的年份和月份。记事本部分提供输入、保存、显示、删除日志的功能。用户输入的日志记录在
4、本系统所在的目录保存为后缀名为.txt的文本文件。 用户只要选定要查看日志的日期,即可以通过鼠标点击显示日志的按钮来实现。1.2 课程设计题目基于Java语言的日历记事本1.3 课程设计目的1.巩固和提高java编程技术。2.培养掌握成学设计的基本思路和方法。3.加强研发、调试程序的能力。4.增强分析、解决问题的能力。5.提高科技论文写作能力。1.4 课程设计内容设计GUI界面的日历记事本。系统将日历、记事本功能结合在一起,用户可以方便地在任何日期记录下有关内容或查看某个日期的记录内容。为使用者记录、管理个人日记以及每日心里路程,其中主要实现以下功能 本系统界面的左侧是日历。系统界面的右侧是记
5、事本。选择具体日期后,可以将记事本的内容保存起来,形成一个日志。显示信息:用户可以向前翻页查询前一个月的日期,也可以向后翻页查询下一个月的日期。1.5 项目背景和目标目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并涉及到网络、多线程等重要的基础知识,因此Java语言也是学习面向对象编程和网络编程的首选语言。按照教学培养计划要求,学生在学习完课本中指定课时的知识后,应安排一定课时的课程设计。其主要目的是使学生深入理解并实践在本课程中所学的有关JAVA程序设计方面的语言基础、异常处理、事件处理、小应用程序以及图形用户界面设计等。故此“日历记事本”应运而生。本课程设计是为
6、了配合Java程序设计课程,帮助学生深入学习掌握Java语言,熟练运用这个工具而设立的课程。通过课程设计各个项目的综合训练,加强学生对JAVA语言的理解,检验学生对专业理论知识理解与掌握的程度,锻炼学生综合运用JAVA程序设计处理所学的知识实际分析问题、解决问题的能力,使课堂上的理论在实践中得到运用,提高学生的综合素质,为学生毕业后的实际工作打好基础。同时也满足了大多数同学对于一款简单易用的日记本软件的需求。第2章 系统需求分析2.1 系统目标1系统界面的左侧是日历。该日历可以按年份前后翻动,鼠标单击“上年”按钮时,当前日历的年份减一;当鼠标左键单击“下年”按钮,当前日历的年份加一。2该日历也
7、可以在某年内按月前后翻动。当鼠标左键单击“上月”按钮时,当前日历的月份减一;当鼠标左键单击“下月”按钮时,当前日历的月份加一。3使用鼠标左键单击选定的日期,如已有记录内容,系统将弹出对话框提示该日已有记录内容,并询问用户是否用记事本显示该内容。4用户选择具体日期后,可以将记事本的当前内容保存起来,形成日志。 2.2 主体功能用户可以方便地在任何日期记录下有关内容或查看某个日期的记录内容。通过按按钮“上年”和“下年”对年份进行翻页。通过按按钮“上月”和“下月”对月份进行翻页。用户可以通过输入年份来查看自己的日志。显示信息:用户可以向前翻页查询前一个月的日期,也可以向后翻页查询下一个月的日期。定时
8、提醒:用户可以针对某一天来添加,删除和编辑这一天的日程提醒信息,当系统时间和提醒时间相吻合时,给出具有提示信息的对话框。查询信息:用户可以查询到某个月的所有的提示信息。页面设计分为左右两个部分,左部分为日历的视图,上边放置了调节年份和月份的按钮,下边是日历的格式。右部分作为一个备忘录的文本域。当该日写有备忘时,会在文本域弹出提示有备忘是否查看。文本域的下边设有增加备忘和删除当前备忘的按钮。2.3 开发环境Windows XP;jdk1.5.0-0-05;ultraedit开发工具第3章 系统概要设计3.1 系统的功能模块划分本日历记事本共有4个java源文件。CalendarPad.java:
9、该java文件生成的类负责创建本日历记事本程序主窗口。该类含有main方法,程序从该类开始执行。Year.java:该文件负责创建管理年份的对象。Month.java:该文件负责创建管理月份对象。NotePad.java:该文件负责创建记事本。CalendarPad(主类)NotePadYearMonth 图3-1 类之间的关系3.2 系统流程1.系统实现设置日历牌 CalendarPad 排列号码mousePressed 事件 图3-2 系统功能结构2.系统实现流程CalendarPad作为主函数的入口。调用NotePad类的方法完善自己的窗口。当对窗口的年份和月份进行改变时就会触发Year
10、类和Month类里的触发器和方法,从而达到日历备忘录的目的。是 显示窗口界面保存日志 删除日志读取日志保存日志显示日志 选择日期删除并去掉“有” 否 是 是是 否否结束程序 开始 图3-3 系统流程实现第4章 系统详细设计4.1 程序变量和方法在设计日历记事本时,需要编写3个Java类:CalendarPad.java、Year.java、NotePad.java、month.java。日历记事本除了需要编写的上述3个Java所给出的类外,还需要Java系统提供的一些重要的类,如JTextField、JTextArea和File类。图形界面至少要有一个顶级Swing容器顶级Swing容器为其它
11、Swing组件在屏幕上的绘制和处理事件提供支持;常用的顶级容器:Frame(框架):表示主程序窗口JDialog(对话框):每个JDialog对象表示一个对话框,对话框属于二级窗口JApplet(小程序):在浏览器内显示一个小程序界面一个框架包括边界、菜单栏、工具栏、状态栏,以及中间占主要部分的窗格窗格也可以看作是一种面板,但它是框架的一个组成部分组件不会直接放到框架上,而是放在若干个面板上,这些面板再放到窗格上用框架对象的getContentPane()函数来获得窗格,再调用窗格的add()函数放置面板public static void main(String args)JFrame fr
12、ame=new JFrame(SwingApplication);JPanel panel1=new JPanel();frame.getContentPane().add(panel1,BorderLayout.CENTER);关键是java.awt.*里面的两个与显示设备有关的类:GraphicsEnvironment和GraphicsDevice。GraphicsEnvironment为Java应用程序提供了特定平台的 GraphicsDevice对象和 Font 对象集合。这些GraphicsDevice可以是各种本机和远端机器的资源,如屏幕、打印机或者是Image Buffer,甚至
13、是Graphics2D绘图方法的目标对象。而GraphicsDevice就是指特定的图形环境了,如屏幕和打印设备等。这样,我们就可以用GraphicsDevice来操纵屏幕了。GraphicsDevice提供的setFullScreenWindow()方法就是设置全屏幕用的。监听器actionlistion:方 法:actionPerformed事 件:ActionEvent String getActionCommand()actioncommand是控件内部的一个字符串,用于标识控件的状态。此函数可以取得控件的状态,从而决定到底该做什么。 int getModifiers()取得“产生此事
14、件时,用户同时按下的组合键” long getWhen()取得“产生此事件时的时间戳”事件产生原因:点击按钮,在列表框中选择内容,在文本框中点回车,计时器到期。1.CalendarPad类 表4-1主要成员变量(属性) 成员变量描述变量类型名称年、月、日intYear,month,day保存日志的散列表Hashtablehashtable存放散列表的文件Filefile显示日期JTextFieldshowDay日历对象Calendar日历记事本对象NotePadnotepad月Month负责改变月年Year负责改变年 表4-2 主要方法 名称功能备注CalendarPad创建程序主窗口构造方法
15、设置日历牌设置日历的年份、月份排列号码排列月份中的号码mousePressed处理MouseEvent事件接口方法mian程序开始运行2.记事本NotePad 表4-3主要成员变量(属性) 描述变量类型名称文本输入区JTextAreatext保存、删除日志的按钮Button保存日志、删除日志保存日志的散列表Hashtabletable保存散列表的文件Filefile记录日志的年、月、日intyear,month,day 表4-4 主要方法名称功能备注NotePad创建记事本对象构造方法setYear设置年份getYear获取年份setMonth设置月份getMonth获取月份setDay设置日
16、期getDay获取日期获取日志内容获取日志内容保存日志保存日志删除日志删除日志actionPerformed处理ActionEvent事件接口方法3.年Year 表4-5主要成员变量(属性)描述变量类型名称表示年份的整数(负数表示公元前)intyear显示年份的文本条JTextFieldshowYear负责增减年份的按钮JButton明年,去年 表4-6 主要方法名称功能备注Year创建“年”对象构造方法setYear设置年份getYear获取年份actionPerformed处理ActionEvent事件接口方法4.月Month 表4-7主要成员变量(属性)描述变量类型名称表示月份的整数(负
17、数表示公元前)intmonth显示月份的文本条JTextFieldShowMonth负责增减月份的按钮JButton上月,下月 表4-8 主要方法名称功能备注 Month创建“月”对象构造方法set Month 设置月份get Month 获取月份actionPerformed处理ActionEvent事件接口方法第5章 算法描述和编码实现5.1 类的算法主类的算法:CalendarPad 类首先创建用于布局的面板,左面添加日历牌,右面添加记事本。 然后调用 CalendarPad 方法,该方法有三个分别是 year, month, day 的整形参数。 该方法管理日历记事本的主界面。 在日历
18、牌部分使用网格布局,行数和列数均为 7。 其中第一行显示星期标题的标签,后续六行显示日期的标签。号码排列算法:该方法包含两个整形参数,分别是星期几和月天数。 该方 法的作用是将日期一次排列入日历牌的网格中,日期显示的字体字体均为 TimesRoman,并将星期六显示为蓝色,星期日显示为红色。 将当前日期显示为绿色,大小为 20,其它 日期为黑色,字体大小为 12。设置日历牌方法的算法:该方法有两个整形参数,分别是 year 和 month。该方法根据平、闰年以及每个月份的天数不同而以不同的方式将一个月中的每一天依次排入网格中。 当月份为 1、3、5、7、8、10 和 12 时,每月包括 31
19、天,当月份为 4、6、9、11 时,每月包括30 天,平年的 2 月为 28 天,闰年的 2 月为 29 天。记事本的算法描述如下:NotePad 类首先调用 NotePad 方法创建一个容器,在这一容器中使用了边界布局管理器。在该布局的北部是一个显示日期的信息条,该信息条显示的信息使用的字体是 TimesRoman,大小是 16 号。 该信息条显示的日期为用户所选定的日期。 在布局管理器的中部是一个 10*10 的文本区域。 该文本区域用来输入和显示日志的内容。 在布局管理器的南部放置了两个按钮分别表示“保存日志”和“删除日志”。 在用户使用鼠标点击这两个按钮时会调用 actionPerfo
20、rmed 方法,以执行保存日 志或删除日志的操作。执行保存日志的操作需要调用方法“保存日志”。 该方法的参数为三个整形变量,分别是:year, month, day。 当用户点击保存日志按钮后,该方法首先弹出对话 框询问用户是否保 存日志,如果用户选择“是”,则该 方法将日志内 容添加到 所选日期的 散列表对象中,然后将其存为文本文件。执行删除日志的操作需要调用方法“删除日志”。 该方法的参数同样为三个分别为 year, month, day 的整形变量。 当用户点击删本栏目责任编辑:谢媛媛除日志按钮,该方法首先弹出对话框询问用户是否删除日志,如果用户选择“是”,则该 方法首先到文件中 读取散
21、列表对象,然后删除该对象,以达到删除日志的目的。 如果该方法无法读取 散列表对象,即所选日期没有日志,则弹出对话框通知用户当日没有日志记录。 如果用户在选择了一个没有日志记录的日期后点击“删除日志”按钮,系统会弹出对话框提示该日无日志记录。该类还有一个名为“获取日志内容”的方法。 该方法具有三个分别是 year, month, day 的整形参数。 当用户在日历牌中选定一个日期后该方法会判断该日期是否存在日志记录,若有则弹 出对话框询问用户是否要查看日志,如果用 户选择查看日志,该方法则从带有日期项的散列 表中获取日志内容并在文本区域显示出日志的内容。 如果 该日期没有日志记 录,则在 文本区
22、域显示“无日志记录”。5.2 编码实现1.日历记事本系统主面板与日历板模块该模块设计主要主要包含以下成员变量:1) 年(year)2) 月(month)3) 日(day)4) 存放日期的表(Hashtable)5) 存放日志的文件(File)主要方法有:1) 创建程序主面板的构造方法(CalendarPad)2) 处理ActionEvent事件的接口方法(actionPerformed)3) 程序开始运行的main()方法。表5-1 日历记事本系统主面板与日历板模块类名CalendarPadpublic接口MouseListenerpublic方法CalendarPad(int,int,int
23、)设置日历牌(int,int)排列号码(int,int)main()publicpublic voidpublic voidpublic static void在具体设计过程中,首先,基本功能和组件的创建;然后,创建构造方法,这一部分包括:为各个功能创建监听事件,创建程序主面板以及日历面板.添加关闭窗口方法;第三步分为创建监听方法,实现对各个功能模块的操作,以及鼠标点击实现进入相应的功能面板;最后创建相应的main()方法。2.日历记事本系统年设置模块该模块用于实现日历记事本系统中关于年的设置。模块中包含的主要成员变量有用于改变年的按钮(Jbutton 明年 去年),显示年的文本框(JText
24、Field)。模块中包含的主要方法有用于设置年的方法(setYear),用于获取年的方法(getYear)和处理ActionEvent事件的接口方法(actionPerformed)等。 表5-2 日历记事本系统年设置模块类名Yearpublic接口ActionListenerpublic方法setYear()getYear()actionPerformed(ActionEvent e)public voidpublic intpublic void在具体设计过程中,首先,显示年的文本框、按钮、文件列表、区域的创建和初始化;然后创建构造方法,实现以上信息和组件的实体化,下一步实现接口监听,创建
25、监听方法,通过以上方法可以实现年设置模块的基本功能实现。3.日历记事本系统月设置模块该模块用于实现日历记事本系统中关于月的设置。模块中包含的主要成员变量有用于改变月的按钮(Jbutton 上月 下月),显示月的文本框(JTextField)。模块中包含的主要方法有用于设置月的方法(setMonth),用于获取月的方法(getMonth)和处理ActionEvent事件的接口方法(actionPerformed)等。 表3 日历记事本系统月设置模块类名Monthpublic接口ActionListenerpublic方法setMonth()getMonth()actionPerformed(Ac
26、tionEvent e)public voidpublic intpublic void在具体设计过程中与年设置大体上相近,首先,显示年的文本框、按钮,文件列表、区域的创建和初始化;然后创建构造方法,实现以上信息和组件的实体化,下一步实现接口监听,创建监听方法,通过以上方法可以实现年设置模块的基本功能实现。4.日历记事本系统记事本模块该模块中包含的主要成员变量有文本框(JTextArea),按钮(JButton 保存日志 删除日志),用于存放日志记录的文件(File)以及响应相关操作的信息提示(JLabel)。该模块中包含的主要方法有设置信息条,设置文本区,获取日志内容,保存日志,删除日志。
27、表4 日历记事本系统记事本模块 类名NotePadpublic接口ActionListenerpublic方法设置信息条()设置文本区()获取日志内容()保存日志()删除日志()public voidpublic voidpublic voidpublic voidpublic void在具体设计过程中首先,将记事本模块中的文本框、按钮创建和初始化;然后创建构造方法,实现以上信息和组件的实体化,实现接口监听,创建监听方法,选择日期时若记事本系统中已经存在记录,则弹出提示,询问是否查看;若不存在记录,则可以保存日志;对存在的日志使用删除日志功能时会弹出提示是否删除日志,选是即删除日志,选否即可返
28、回.以上即实现学生基本信息模块的基本功能实现。第6章 测试6.1 测试方案1打开主界面,鼠标左键右击,查看日历界面。2选定一个日期写日志。3对日历添加、删除日志。4修改年份,查看一些日志。6.2 测试结果 1.年份改变点击一次“上年”按钮可增加一年,点击一次“下年”按钮可减少一年,多次连续点击即可依次改变多个年份。2.月份改变点击一次“上月”按钮可以增加一月,点击一次“下年”按钮可以减少一月,多次连续点击即可一次改变多个月份。3.日期显示用于显示当前所选择的所在的年份月份的所有日期、星期,并在记载有日志的日期直接跳出“这一天有日志记载,你想看吗?”,而没有记载日志的日期文本中则在文本框中“无记
29、录”。4.日志显示界面的日期框中,可以选择某天记载的日志,并且读取的日志在此部分显示出来。5.保存、删除、读取日志。可以在没有记载日志的日期里记载日志并保存,可以对以保存的日志进行读取、修改或者删除。(1)保存日志:(2)删除日志:(3)查看日志总结 经过几天的努力,基本上完成了我的软件课程设计。通过这次的课程设计,基本上将书本上的知识运用到实践上,从而进一步巩固和丰富所学知识,也让我更加深层次的认识了java及其功能的强大。为了更好地完成这次课程设计,我做了很多准备,上网查阅资料,到图书馆翻阅书籍。这个过程中也锻炼了我的思维分析、遇到问题及想法设法通过各种途径解决问题的能力。 在这个过程中,
30、在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对JAVA语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。从理论到实践,在整整几天的时间里,可以说,是苦大于甜,但确实学到很多东西,同时不仅巩固了以前的知识,而且学到了许多书上学不到的知识。通过这次课程设计使我懂得了理论与实践相结合是很重要的,只有理论知识是不够的,只有把所学的理论知识和实践结合起来,从理论中得出结论,才能真正服务社会,从而提高自己的实际动手能力和独立思考能力。通过这次课程设计,了解到了自己的不足之处,对以前的知识没有掌握到位,所
31、以我们一定要学好理论知识,为以后的实践打下基础。 参考文献1耿祥义,张跃平 Java2实用教程(第三版)M . 北京:清华大学出版社, 2006 2耿祥义 Java课程设计(第三版)M . 北京:清华大学出版社, 20043张跃平 Java2实用教程实验指导与习题解答(第三版)M. 北京:清华大学出版社, 20044Jacquie Barker,Java面向对象编程指南,电子工业出版社,20015孙全党,王吴迪 赵枫朝,Java程序设计应用教程,电子工业出版社,2006.26赵玉阳,Java从入门到精通,清华大学出版社,2006.87肖磊,李钟尉,Java实用教程,人民邮电出版社,2008.5
32、8李尊朝 Java语言程序设计 北京:中国铁道出版社,2004.29王鹏,何昀峰 Java图形界面开发 北京:清华大学出版社200810叶核亚 JAVA2程序设计实用教程M(第2版)北京:电子工业出版社 2008.4附录主类 CalendarPad:CalendarPad。Javaimport java.util.Calendar;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.Hashtable;public class CalendarPad e
33、xtends JFrame implements MouseListener int year,month,day; Hashtable hashtable; File file; JTextField showDay; JLabel title; Calendar 日历; int 星期几; NotePad notepad=null; Month 负责改变月; Year 负责改变年; String 星期=星期日,星期一,星期二,星期三,星期四,星期五,星期六; JPanel leftPanel,rightPanel; public CalendarPad(int year,int month,
34、int day) leftPanel=new JPanel(); JPanel leftCenter=new JPanel(); JPanel leftNorth=new JPanel(); leftCenter.setLayout(new GridLayout(7,7); rightPanel=new JPanel(); this.year=year; this.month=month; this.day=day; 负责改变年=new Year(this); 负责改变年.setYear(year); 负责改变月=new Month(this); 负责改变月.setMonth(month);
35、title=new JLabel7; showDay=new JTextField42; for(int j=0;j7;j+) titlej=new JLabel(); titlej.setText(星期j); titlej.setBorder(BorderFactory.createRaisedBevelBorder(); leftCenter.add(titlej); title0.setForeground(Color.red); title6.setForeground(Color.blue); for(int i=0;i42;i+) showDayi=new JTextField()
36、; showDayi.addMouseListener(this); showDayi.setEditable(false); leftCenter.add(showDayi); 日历=Calendar.getInstance(); Box box=Box.createHorizontalBox(); box.add(负责改变年); box.add(负责改变月); leftNorth.add(box); leftPanel.setLayout(new BorderLayout(); leftPanel.add(leftNorth,BorderLayout.NORTH); leftPanel.a
37、dd(leftCenter,BorderLayout.CENTER); leftPanel.add(new Label(请在年份输入框输入所查年份(负数表示公元前),并回车确定), BorderLayout.SOUTH) ; leftPanel.validate(); Container con=getContentPane(); JSplitPane split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel,rightPanel); con.add(split,BorderLayout.CENTER); con.validate(
38、); hashtable=new Hashtable(); file=new File(日历记事本.txt); if(!file.exists() try FileOutputStream out=new FileOutputStream(file); ObjectOutputStream objectOut=new ObjectOutputStream(out); objectOut.writeObject(hashtable); objectOut.close(); out.close(); catch(IOException e) notepad=new NotePad(this); r
39、ightPanel.add(notepad); 设置日历牌(year,month); addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); setVisible(true); setBounds(100,50,524,285); validate(); public void 设置日历牌(int year,int month) 日历.set(year,month-1,1); 星期几=日历.get(Calendar.DAY_OF_WEEK)-1; if(month=1|month=2|month=3|month=5|month=7 |month=8|month=10|month=12) 排列号码(星期几,31); else if(month=4|month=6|month=9|month=11) 排列号码(星期几,30); else if(month=2) if(year%4=0&year%100!=0)|(year%400=0) 排列号码(星期几,29); else 排列号码(星期几,28); public void 排列号码(int 星期几,int 月天数) for(int i=星期几,n=1;i星期几+月天数;