logo资料库

Java课程设计报告(日历记事本).doc

第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
资料共19页,剩余部分请下载后查看
一、设计任务与目标
二、设计思路
三、具体实现
1、类CalendarPad的主要方法表2所示、CalendarPad.java源文件代码
2、类NotePad的主要方法如表3所示、NotePad.java源文件代码
3、类Year的主要方法如表5所示、源文件Year.java代码
五、程序运行的测试与分析
1、日历记事本总体界面,显示当前时间的日历,结果运行正确。如图3:
2、日历展示功能测试,在年份或月份输入框输入查询的日期,回车进行查询,结果运行正确。测试查询2010
3、点击2011年6月7号的日期,可查看改天记录的日志:如图5
4、日志功能测试,查看2011年6月7号的日志,对日志编辑、保存等操作界面如图6:
六、总结
七、参考资料
计算机与信息工程系 《Java 课程设计》报告 软件技术 专业 班级 学号 姓名 报告完成日期 指导教师 评语: 成绩: 批阅教师签名: 批阅时间:
目录 一、设计任务与目标 ................................................ 1 二、设计思路 ...................................................... 2 三、具体实现 ...................................................... 4 1、类 CalendarPad 的主要方法表 2 所示、CalendarPad.java 源文件代码 4 2、类 NotePad 的主要方法如表 3 所示、NotePad.java 源文件代码 ...... 7 3、类 Year 的主要方法如表 5 所示、源文件 Year.java 代码 ...........12 五、程序运行的测试与分析 ......................................... 15 1、日历记事本总体界面 ......................................... 15 2、日历展示功能测试 ........................................... 15 3、查看日志界面 ............................................... 15 4、日志功能测试 ............................................... 15 六、总结 ............................................. 16 七、参考资料 ..................................................... 17
日历记事本 一、设计任务与目标 “日历记事本”设计内容要求:系统将日历、记事本结合在一起,用户可以方便地在任 何日期记载有关内容以及查看某个日期记载的内容。界面的左侧是日历,可调节年、月、日 和星期。右侧是记事本,用户选择具体日期后,可以将记事本的内容保存起来,形成一个日 志,记事可以实现查看、编辑和删除功能。 对于日历和记事本我们应该很常见,通过查看资料,与实际日历、记事本的联系比较, 最后根据“日历记事本”设计内容要求,得出本课设的根本功能也就是为使用者记录、管理 个人日记以及每日心里路程,其主要设计任务与设计目标如下: 1、界面的左侧是日历。该日历可以按年前后翻动,当鼠标单击“上一年”按钮时,当前 日历的年份将减 1;当鼠标左键单击“下年”按钮,当前日历的年份将加一。 2、也可以在某年内按月前后翻动。当鼠标左键单击“上月”按钮时,当前日历的月份 将减 1;当鼠标左键单击“下月” 当前日历表的月份将加一。 3、使用鼠标左键在要选择的日期上单击,如有记事内容,程序将弹出对话框提示该日 有记事内容,提示用户是否用记事本显示该内容。 4、选择具体日期后,可以将记事本的内容保存起来,形成一个日志。 5、界面的右侧是记事本,当鼠标右击文本区域时,会出现弹出式菜单,可以实现文本的 复制、剪切、粘贴和全选操作。 6、记事本下面是一组对记事本的编辑按钮,可以对日志的内容进行编辑、修改和加密, 可以保存和删除日志。 7、它的功能基本结构图如图所示 1: 本课程设计目的与意义:使学生掌握窗体、菜单的设计,掌握布局的应用,掌握基本组 图 1 功能基本结构图 1
件的应用,掌握各种事件的处理,掌握文件的读写。 二、设计思路 经过对设计目标进行总体分析,“日历记事本”总体功能可概括为两点:日历展示功能和 日志备注功能,日历展示功能可以查询所有的年份(包括公元前)的日历。只要再输入框中 输入所查询年份,按回车键确定,再用“上月”“下月”确定具体月份即可出现所求年月日的 日历。确定相应的日期后,可以在文本框中记下要写的日志(日志文本框具有)日志备注的 功能,写完后点击保存日志,如果想要放弃日志文件,单击删除日志按钮即可。 根据这两点功能,首先对“日历记事本”界面进行布局,总体布局分为两大块,一个用 于日历展示,一个用于日志备注。如何布局界面?设计时出现了不少问题,刚开始只使用了 网格布局和边界布局两种布局方式,不管怎么设计、修改,都不能达到想要的效果。最后, 通过网上搜索资料,看到别人多用了一种盒式布局,设计的界面很协调。所以,我也就借鉴 的一下。 界面设计完之后,接下来就要实现日历展示功能。为了要实现本功能,首先要了解 JAVA 基础一些知识,如类的封装与继承,java.util.Calendar 的介绍,如何定义一个日历类 CalendarPad 用于展示某年某月的日历分布,其中要考虑如何获得当前月的天数及当前月的 第一天是星期几等问题。设计过程出现的典型问题是设置日历的年和月忘记月份减 1,获取 当前月第一天是星期几时也忘记减 1 了。日历的星期标签设计,这个相对简单没什么问题。 最后就是实现日志备注功能了,这个功能与大部分记事本功能类似,在设计实现比较简 单。不过期间,还是出现了一些问题。日志的保存、删除不成功,因为在本程序中对日志的 保存和删除时,用到了哈希表。哈希表用于存储日志内容的,对哈希表的一些方法不熟悉, 在使用时出现错误。最后,通过询问同学,查看资料最终完成了该功能。还有在设计弹出菜 单时,给文本区域注册用鼠标适配器出错,这个问题我整了一上午就是没发现那个地方错了, 询问同学,也没解决。最后没办法,又换了一种注册方法,竟然可以了。看来先前的注册不 符合该程序的总体要求。 记事本界面的基本设计实现:“上年”“下年”“上月”“下月”均采用按钮形式,方便上 下翻动;星期采用标签的形式;日期采用 42 个网格;记事本采用文本形式,“保存日志”“删 除日志”采用按钮形式。 为了美观起见,将年份输入框及其按钮放在左上方,下面是日历, 日历采用不同颜色,使其美观。右侧时日志记事本,“保存日志”“删除日志”按钮放在其下 面。 最终设计结果是:本系统共包括 4 个 Java 源文件,类之间的关系如图 2 所示: 2
系统基本流程图如图所示 3: 图 2 类之间的关系 Java 源文件及其功能如表 1 所示: 图 3 系统基本流程图 表 1 文件清单 文件名 主要功能 备注 CalendarPad.java 创建日历记事本系统的“主窗口” 包含 main 方法 NotePad.java 创建记事本,给记事本加密 Year.java Month.java 获取系统时间 获取系统时间 3
三、具体实现 1、类 CalendarPad 的主要方法表 2 所示、CalendarPad.java 源文件代码 从方法中可看出类 CalendarPad 程序的用途和大体工作过程 名称 CalendarPad 日历设置 排列日期 getYear setYear getMonth setMonth getDay setDay getWeek getHashtable getFile 表 2 功能 创建主窗口 设置日历牌 排列星期几和月天数 备注 构造方法 获取年数 设置年数 获取月数 设置月数 获取月天数 设置月天数 获取星期几 获取哈希表 获取文件 mousePressed 处理鼠标事件 main(String args[]) 程序开始 接口类 入口方法 源文件 CalendarPad.java 代码 import java.util.Calendar;//导入代码所需要的 JDK 包 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.Hashtable; public class CalendarPad extends MouseAdapter { //创建主窗体 CalendarPad 类 JFrame f=new JFrame("我的日历记事本"); int year,month,day; //Hashtable hashtable;//哈希表 Hashtable hashtable;//哈希表 File file; JTextField showDay[]; //显示日期文本区 JLabel title[]; Calendar 日历; NotePad notepad; //记事本对象 //文件 //题目标签(星期标签) int 星期几; 4
//改变年对象 //改变月对象 Year 负责改变年; Month 负责改变月; String 周[]={"周日","周一","周二","周三","周四","周五","周六"}; JPanel leftPanel,rightPanel; public { CalendarPad(int year,int month,int day)//创建主窗体的 CalendarPad 构造方法 this.year=year; this.month=month; this.day=day; leftPanel=new JPanel();//存放日历 JPanel leftNorth=new JPanel();//改变年、月的面板 JPanel leftCenter=new JPanel();//日历显示面板 leftCenter.setLayout(new GridLayout(7,7)); rightPanel=new JPanel();//日历记事面板 负责改变年=new Year(this);//实例化 Year 对象 负责改变年.setYear(year); 负责改变月=new Month(this);//实例化 Month 对象 负责改变月.setMonth(month); title=new JLabel[7]; showDay=new JTextField[42]; for(int j=0;j<7;j++) //显示星期的标签 { title[j]=new JLabel(周[j],0); title[j].setBorder(BorderFactory.createRaisedBevelBorder());//设置 JLabel 组件的边框 leftCenter.add(title[j]); } title[0].setForeground(Color.red); title[6].setForeground(Color.blue); //显示日期 for(int i=0;i<42;i++) { showDay[i]=new JTextField(); showDay[i].addMouseListener(this);//给日期文本区注册鼠标适配器 showDay[i].setEditable(false); leftCenter.add(showDay[i]); } 日历=Calendar.getInstance(); //获得当前日历 Box box=Box.createHorizontalBox(); //声明并创建一个水平的盒式布局 box.add(负责改变年);//添加改变年、月的容器(盒式布局) box.add(负责改变月); leftNorth.add(box);//向面板 leftNorth 中加载盒式布局 JLabel L=new JLabel("请在输入框输入所查日期(负年份表示公元前),回车确定",0);//提示语标签 L.setForeground(Color.blue); leftPanel.setLayout(new BorderLayout()); leftPanel.add("North",leftNorth); leftPanel.add("Center",leftCenter); leftPanel.add("South",L); leftPanel.validate();//验证此容器及其所有子组件 JSplitPane split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,leftPanel,rightPanel); f.add("Center",split); //分隔窗格中的左右两个面板 从左到右排列,即左右面板的分割线 hashtable=new Hashtable();//哈希表对象 file=new File("日历记事本.txt");//创建记事本文件 if(!file.exists()) { try{ FileOutputStream out=new FileOutputStream(file); 5
ObjectOutputStream objectOut=new ObjectOutputStream(out); objectOut.writeObject(hashtable);//writeObject 方法用于将对象写入 hashtabel 中 objectOut.close();//关闭流 out.close(); } catch(IOException e){} } notepad=new NotePad(this); //实例化记事本 rightPanel.add(notepad); 日历设置(year,month);//调用日历设置方法 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体的一些设置 f.setVisible(true); f.setBounds(100,50,730,285); f.setResizable(false); f.validate(); } public void 日历设置(int year,int month)//计算天数,用于显示日期 { 日历.set(year,month-1,1); //设置日历字段 YEAR、MONTH(0~11) 和 DAY_OF_MONTH 的值 星期几=日历.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))//判断闰年,设置 2 月的月天数 排列日期(星期几,29); 排列日期(星期几,28); else } } public void 排列日期(int 星期几,int 月天数)//排列星期几和月天数 { } for(int i=星期几,n=1;i<星期几+月天数;i++) { showDay[i].setText(""+n);//用 n 来表示日历显示的内容 if(n==day) { showDay[i].setForeground(Color.green); showDay[i].setFont(new Font("TimesRoman",Font.BOLD,20)); } else { showDay[i].setFont(new Font("TimesRoman",Font.BOLD,12)); showDay[i].setForeground(Color.black); } if(i%7==6) showDay[i].setForeground(Color.blue); if(i%7==0) showDay[i].setForeground(Color.red); n++; } for(int i=0;i<星期几;i++) showDay[i].setText(""); for(int i=星期几+月天数;i<42;i++) showDay[i].setText(""); public void setYear(int y) { year=y; notepad.setYear(year);} public int getYear() 6
分享到:
收藏