计算机与信息工程系
《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
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