1、 面向对象程序设计课程设计报告题 目: 电子日历记事本的设计 院 (系): 信息科学与工程学院 专业班级: 计算机科学与技术 1201 班 学生姓名: 程伟 学 号: 20121183011 指导教师: 吴奕 20 14 年 12 月 29 日至 20 15 年 1 月 9 日华中科技大学武昌分校制面向对象程序设计 课程设计任务书一、设计(调查报告/论文) 题目电子日历记事本的设计二、设计(调查报告/论文)主要内容内容:设计 GUI 界面的日历记事本,系统将记事本与日历相结合,可在任何时间记载编辑或查看相关内容日志,系统可实现基本的辅助办公与行政管理。基本功能与要求:设计记事本编辑器程序,所有
2、编辑功能可以在菜单栏中选择,包括编辑、保存、打开、剪切、复制等操作,能打开和显示已存在的文本文件,界面设计要求采用类组件实现。设计日历系统,要求用图形用户界面实现,用户可以方便地在任何日期编辑有关内容以及查看某个日期记载的内容。日历可以按年/月前后翻动,当鼠标单击“上一年/ 上一月”按钮时,当前日历的年份/月份将减一;当鼠标左键单击“下一年/下一月”按钮,当前日历的年份/月份将加一。使用鼠标左键在要选择的日期上单击,如有记事内容,程序将弹出对话框提示用户是否用记事本显示该内容或编辑新内容,同时可将记事本的新内容保存起来,形成一个日志供用户日后使用。设计用户密码功能或对信息内容加密,提高系统的安
3、全性。三、原始资料1.面向对象程序设计课程设计指导书2. 耿祥义JAVA 大学实用教程北京:清华大学出版社,2009四、要求的设计(调查/论文)成果1.课程设计报告2.课程设计软件五、进程安排布置任务,查找资料、需求分析 1 天总体设计 1 天详细设计 1.5 天编制源程序实现 3.5 天测试与修改 1 天撰写课设报告 2 天六、主要参考资料1 张广彬. Java 课程设计案例精编(第二版).北京:清华大学出版社, 2011. 2 耿祥义. Java 课程设计(第二版).北京:清华大学出版社, 2008.3 耿祥义JAVA 大学实用教程北京:清华大学出版社,20094 邹林达陈国君 Java2
4、 程序设计基础北京:清华大学出版社,20105 邹林达Java2 程序设计基础实验指导北京:清华大学,2010指导教师(签名):20 年 月 日目 录1需求与总体设计.11.1需求分析.11.2总体设计思路.11.2.1功能图.11.2.2类图.22详细设计.32.1 CalendarPad类说明.32.2 Year类说明32.3 Month 类模块 42.4 NotePad类说明.43编码实现.63.1 CalendarPad模块.63.2 Year模块.113.3 Month 模块 .143.4 NotePad模块164系统运行与测试 234.1程序主界面234.2日志查看 无日志234.
5、3建立日志244.4日志查看 有日志244.5删除日志26总结 .2701 需求与总体设计1.1需求分析根据题目要求,将日历与记事本功能相结合,实现对某日期的事件进行记录的功能,设计出简洁方便美观的 GUI 界面。将本程序主界面可以分为四个部分:日历日期信息展示、年份、月份、记事本内容、记事本下方的时钟,用四个类来实现其“日历”和“记事本”这两大功能。通过主类 CalendarPad 创建动日历记事本软件的主界面,且该类中含有 main 方法,程序从该类开始执行。再用余下的 year、mouth、NotePad 类来显示并改变日期和实现记事本的功能。 1.2 总体设计思路1. 可以编辑日历的日
6、期2. 可以判断当前日期是否存在日志记录3. 对有日志记录的日期,可以对该日期的日志记录进行修改和删除4. 对没有日志记录的日期,可以创建并保存新建的日志记录5. 对保存的日志加密,查看时得输入密码1.2.1 功能图电 子 日 历 记 事 本 的 系 统记事本编辑器 日 历 系 统密 码查 看 日 志编 辑 日 志 编 辑 日 期11.2.2类图+ C a l e n d a r P a d ( )+ 设置日历牌 ( )+ 排列号码 ( )+ g e t Y e a r ( )+ s e t Y e a r ( )+ g e t M o n t h ( )+ s e t M o n t h (
7、 )+ g e t D a y ( )+ s e t D a y ( )+ g e t H a s h t a b l e ( )+ m o u s e P r e s s e d ( )+ m a i n ( )- y e a r- m o n t h- d a y- f i l e- c a l e n d a r P a d- s h o w Y e a r- s h o w M o n t h- w e e kC a l e n d a r p a d+ n o t e p a d ( )+ a c t i o n P e r f o r m e ( )+ s e t Y e a r
8、( )+ s e t M o n t h ( )+ g e t M o n t h ( )+ s e t D a y ( )+ 设置信息条 ( )+ 获取日志内容 ( )+ 保存日志 ( )+ 删除日志 ( )- t e x t- f i l e- d e l t e- s a v e- y e a r- m o n t h- d a yN o t e p a d+ M o n t h ( )+ s e t M o n t h ( )+ g e t M o n t ( )+ a c t i o n P e r f o r m e d ( )- y e a r- m o n t h- d a y
9、M o n t h+ Y e a r ( )+ s e t Y e a r ( )+ g e t Y e a r ( )+ a c t i o n P e r f o r m e d ( )- y e a r- m o n t h- d a yY e a r22 详细设计2.1 CalendarPad 类说明该模块设计主要主要包含以下成员变量:年(year) 月(month)日(day)存放日期的表(Hashtable)存放日志的文件(File)主要方法有:创建程序主面板的构造方法(CalendarPad)处理 ActionEvent 事件的接口方法(actionPerformed)程序开始运
10、行的 main()方法。表 1 日历记事本系统主面板与日历板模块(CalendarPad.java)类名 CalendarPad public接口 MouseListener public方法CalendarPad(int,int,int)设置日历牌(int,int)排列号码(int,int)main()publicpublic voidpublic voidpublic static void2.2 Year 类说明该模块用于实现日历记事本系统中关于年的设置模块中包含的主要成员变量有用于改变年的按钮(Jbutton 明年 去年),显示年的文本框(JTextField)模块中包含的主要方法有用
11、于设置年的方法(setYear),用于获取年的方法(getYear)和处理 ActionEvent 事件的接口方法(actionPerformed)等3表 2 日历记事本系统年设置模块(Year.java)类名 Year public接口 ActionListener public方法setYear()getYear()actionPerformed(ActionEvent e)public voidpublic intpublic void2.3 Month 类模块该模块用于实现日历记事本系统中关于月的设置模块中包含的主要成员变量有用于改变月的按钮(Jbutton 上月 下月),显示月的文本
12、框(JTextField)模块中包含的主要方法有用于设置月的方法(setMonth),用于获取月的方法(getMonth)和处理 ActionEvent 事件的接口方法(actionPerformed)等表 3 日历记事本系统月设置模块 (Month.java)类名 Month public接口 ActionListener public方法setMonth()getMonth()actionPerformed(ActionEvent e)public voidpublic intpublic void2.4 NotePad 类说明该模块中包含的主要成员变量有文本框(JTextArea),按钮
13、(JButton 保存日志 删除日志),用于存放日志记录的文件(File)以及响应相关操作的信息提示(JLabel)该模块中包含的主要方法有设置信息条,设置文本区,获取日志内容,保存日志,删除日志4表 4 日历记事本系统记事本模块 (NotePad.java)类名 NotePad public接口 ActionListener public方法设置信息条()设置文本区()获取日志内容()保存日志()删除日志()public voidpublic voidpublic voidpublic voidpublic void53 编码实现源代码import java.util.Calendar;im
14、port javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.Hashtable;import java.util.*;import javax.swing.event.*;public class CalendarPad extends JFrame implements MouseListenerint year,month,day; /定义全局变量的三个属性Hashtable hashtable; File file; /定义一个文件变量JTextField s
15、howDay; /定义一个文本框组数 JLabel title;Calendar 日历;int 星期几; NotePad notepad=null; /定义一个NotePad对象,必须先给其处置null才能在下面使用Month 负责改变月;Year 负责改变年 ;String 星期=“SUN“,“MON“,“TUE“,“WED“,“THU“,“FRI“,“SAT“; /日历表的文字显示JPanel leftPanel,rightPanel; /定义左右两个面板,左边用来显示日历,右边用来显示记事本public CalendarPad(int year,int month,int day) /主
16、类的构造方法,实现了主界面 leftPanel=new JPanel(); /创建左面板JPanel leftCenter=new JPanel();JPanel leftNorth=new JPanel();leftCenter.setLayout(new GridLayout(7,7); /设置面板布局格式,采用行列式,七行七列 rightPanel=new JPanel();this.year=year; /设置year的值this.month=month;this.day=day;负责改变年=new Year(this); 6/将当前对象的所有操作和属性赋值给year,使 Year类的
17、对象可以进行相应的操作负责改变年.setYear(year);负责改变月=new Month(this);负责改变月.setMonth(month);title=new JLabel7; /创建一个标签数组 showDay=new JTextField42; /显示每一天的文本框数组,表示共有42个文本框,每个文本框显示一天for(int j=0;j=1)this.month=month;elsethis.month=1;showMonth.setText(“+month);public int getMonth()return month;public void actionPerforme
18、d(ActionEvent e)if(e.getSource()=上月)if(month=2)month=month-1;日历.setMonth(month);日历.设置日历牌(日历.getYear(),month);else if(month=1)month=12;日历.setMonth(month);日历.设置日历牌(日历.getYear(),month);showMonth.setText(“+month);else if(e.getSource()=下月)if(month12)month=month+1;日历.setMonth(month);日历.设置日历牌(日历.getYear(),
19、month);else if(month=12)14month=1;日历.setMonth(month);日历.设置日历牌(日历.getYear(),month);showMonth.setText(“+month);class NotePad extends JPanel implements ActionListenerJTextArea text;JButton 保存日志,删除日志 ;Hashtable table;JLabel 信息条;int year,month,day;File file; CalendarPad calendar;public NotePad(CalendarPa
20、d calendar)this.calendar=calendar;year=calendar.getYear();month=calendar.getMonth();day=calendar.getDay();table=calendar.getHashtable();file=calendar.getFile();信息条=new JLabel(“+year+“年“+month+“月“+day+“日“,JLabel.CENTER);信息条.setFont(new Font(“TimesRoman“,Font.BOLD,16);信息条.setForeground(Color.blue);tex
21、t=new JTextArea(10,10);保存日志=new JButton(“保存日志“);删除日志=new JButton(“删除日志“);保存日志.addActionListener(this);删除日志.addActionListener(this);setLayout(new BorderLayout();JPanel pSouth=new JPanel();add(信息条,BorderLayout.NORTH);pSouth.add(保存日志);pSouth.add(删除日志);add(pSouth,BorderLayout.SOUTH);add(new JScrollPane(
22、text),BorderLayout.CENTER);15public void actionPerformed(ActionEvent e)if(e.getSource()=保存日志)保存日志(year,month,day);else if(e.getSource()=删除日志)删除日志(year,month,day);public void setYear(int year)this.year=year;public int getYear()return year;public void setMonth(int month)this.month=month;public int get
23、Month()return month;public void setDay(int day)this.day=day;public int getDay()return day;16public void 设置信息条(int year,int month,int day)信息条.setText(“+year+“年“+month+“月“+day+“日“);public void 设置文本区(String s)text.setText(s);public void 获取日志内容(int year,int month,int day)String key=“+year+“+month+“+day;
24、tryFileInputStream inOne=new FileInputStream(file);ObjectInputStream inTwo=new ObjectInputStream(inOne);table=(Hashtable)inTwo.readObject();inOne.close();inTwo.close();catch(Exception ee)if(table.containsKey(key) String m=“+year+“年“+month+“月“+day+“这一天有日志记载,想看吗?“;int ok=JOptionPane.showConfirmDialog(
25、this,m,“询问“,JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);if(ok=JOptionPane.YES_OPTION) String str = JOptionPane.showInputDialog(null,“请输入密码“,“消息对话框“,JOptionPane.INFORMATION_MESSAGE);long num = Integer.parseInt(str);if(num!=123456)JOptionPane.showInputDialog(this,“密码不正确!“,“确认对话框“,JOptionPa
26、ne.WARNING_MESSAGE);else if(num=123456)int n =JOptionPane.showConfirmDialog(this,“确认正确吗?“,“ 确认对话框“,JOptionPane.YES_NO_OPTION);text.setText(String)table.get(key);17else text.setText(“); else text.setText(“无记录“); public void 保存日志(int year,int month,int day)String 日志内容=text.getText();String key=“+year+
27、“+month+“+day;String m=“+year+“年“+month+“月“+day+“ 保存日志吗?“;int ok=JOptionPane.showConfirmDialog(this,m,“询问“,JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);if(ok=JOptionPane.YES_OPTION)tryFileInputStream inOne=new FileInputStream(file);ObjectInputStream inTwo=new ObjectInputStream(inOne);tabl
28、e=(Hashtable)inTwo.readObject();inOne.close();inTwo.close();table.put(key,日志内容);FileOutputStream out=new FileOutputStream(file);ObjectOutputStream objectOut=new ObjectOutputStream(out);objectOut.writeObject(table);objectOut.close();out.close();catch(Exception ee)public void 删除日志(int year,int month,i
29、nt day)String key=“+year+“+month+“+day;if(table.containsKey(key)String m=“删除“+year+“年“+month+“月“+day+“ 日的日志吗?“;int ok=JOptionPane.showConfirmDialog(this,m,“询问18“,JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);if(ok=JOptionPane.YES_OPTION)tryFileInputStream inOne=new FileInputStream(file);Ob
30、jectInputStream inTwo=new ObjectInputStream(inOne);table=(Hashtable)inTwo.readObject();inOne.close();inTwo.close();table.remove(key);FileOutputStream out=new FileOutputStream(file);ObjectOutputStream objectOut=new ObjectOutputStream(out);objectOut.writeObject(table);objectOut.close();out.close();tex
31、t.setText(null);catch(Exception ee)elseString m=“+year+“年“+month+“月“+day+“ 无日志记录“;JOptionPane.showMessageDialog(this,m,“提示“,JOptionPane.WARNING_MESSAGE);194 系统运行与测试4.1 程序主界面图 1 日历记事本系统主界面4.2 日志查看无日志图 2 无日志界面204.3 建立日志图 3 保存日志4.4 日志查看有日志图 3 有日志21图 4 密码登陆图 5 查看到日志内容224.5 删除日志图 6 删除日志界面23总结经过这一次的设计,总体来
32、说收获还是不小.刚刚开始学习 Java 语言的时候也曾经想过利用所学的知识来做些真东西.之前用过 C 语言编写过一些程序,但 C 语言与 Java之前差异比较大,而 Java 语言对我来说是个新事物,对 Java 了解不是十分深刻,用起来也不能得心应手.但是此次的设计让我对 Java 有了更深刻的认识和了解,通过亲手编写Java 程序不仅大大的提高了我的动手能力,更让我从更深一层来了解 Java 语言.尽管如此,但 Java 中可发掘的东西太多了,一个小小的程序不可能将全部的内容都展现出来.因此对 Java,我依然还有许多不明白的地方.这将在之后的学习中进行更深层次的学习.与指导书上的程序相比
33、,我做出的程序要简单得多.将书上的 6 个类简化为 4 个.本来计划添加一个背景音乐,结果在调用时才发现类型不同,能力有限,调用不了,在网上找了找了很多解决办法,但是最后还是行不通,左后还是放弃了.虽然程序简单,但当程序通过编译并成功运行的时候依然让我兴奋不已.程序虽小,但其中所包含的不仅仅是一些代码.它也是对我这段时间学习的肯定.虽然这个程序成功了,但是这个过程也十分坎坷.在写代码的时候经常出现手误导致编译无法通过,这些细节都是因为平时动手不够多,编写程序不够熟练导致的,在以后的学习中也要加强动手能力,多实践.这样才能从各个方面来提高自己的水平.24课程设计成绩评定表项 目 比例 得 分平时成绩(百分制记分) 30%业务考核成绩(百分制记分) 70%总评成绩(百分制记分) 100%成绩评定评定等级 优 良 中 及格 不及格指导教师(签名):20 年 月 日