日历记事本
淮 海 工 学 院 计算机
学院
课程设计
设计名称:
选题名称: 日历记事本的设计与实现
姓名: 学号:
专业班级:
系 (院):
设计时间: 2010.6.21~2010.7.2 设计地点: 软件实验室、教室
指导教师评语:
成绩:
签名:
年 月 日
面向对象课程设计报告 第 2 页,共 47 页
1(设计要求
系统用例图如图1所示
保存日志
**
删除日志日历显示********
用户读取日志**
图1 系统用例图 (1) 保存日志
用例名称:
保存日志
用例说明:
用于用户进行日志的保存
先决条件:
用户有在文本中编写了日志
预期结果:
在dailyRecord文件夹中生成一个文本文档,且文本文档的名称是日志的时间,且在日历上当天出现一个
图标
基本过程:
?判断当天是否已有日志:
?若已有日志,是否添加日志:添加或者不添加
?若无日志,则直接保存。
(2)读取日志
用例名称:
读取日志
面向对象课程设计报告 第 3 页,共 47 页
用例说明:
用于用户读取日志
先决条件:
当天已经有日志存在
预期结果:
在文本区域里显示当天的日志
基本过程:
若存在日志,则读取出来;若无日志,则不读取
(3)删除日志
用例名称:
删除日志
先决条件:
当天日志已有日志
预期结果:
在dailyRecord文件夹里名字为当天时间的文本文档删除掉,在日历上当天的图标图标消失
基本过程:
若有日志则删除;若无日志则不操作
(4)日历显示
用例名称:
日历显示
预期结果:
若当天有日志,责日历上会有个图标;若当天没有日志,则没图标。
若当天保存日志,则在当天日历上增加增加一个图标;若删除日志当天则图标消失。
面向对象课程设计报告 第 4 页,共 47 页 2(总体设计
在设计日历记事本时,总体编写了7个类,CalendarNotePad.class,rilijishi.class,Calendapad.class, Clock.class,Edit.class,Imagecanvas.class,GunDong.class。其关系如下:
CalendarNotePad
rilijishi
CalendarpadEditClockImagecanvasGunDong
图2 整体类的关系
(1) CalendarNotePad类(主类)
CalendarNotePad类主要负责创建主函数。
(2) rilijishi类
rilijishi类主要负责创建日历记事本主窗口。其中有5中重要类型的对象:Calendarpad、Edit、
Clock、Imagecanvas和GundDong对象。
(3) Calendarpad类
Calendarpad类是JPane的子类,是创建rilijishiben类的重要成员之一,主要刻画日历相关的
数据。
(4) Edit类
Edit是JPanel的子类,提供了编辑、读取、保存、删除日志的功能。
(5) Imagecanvas类
Imagecanvas类是Canvas的一个子类,是创建rilijishiben类的重要成员之一,负责绘画图片。
(6) Clock类
Clock类是Canvas的一个子类,是创建rilijishiben类的重要成员之一,负责时钟以及闹铃。
(7)GunDong类
GunDong类Canvas的一个子类,是创建rilijishiben类的重要成员之一,负责滚动字幕。
面向对象课程设计报告 第 5 页,共 47 页
3(详细设计
设计系统界面,对每个类的属性和方法进行详细设计,并通过主控类连结各个逻辑功能类。为便于在课
程设计过程中小组成员分工协作,将各个类用包(可用无名包)进行逻辑组织。 (1)CalendarPadNote类
创建了主函数main()。
CalendarNotepad
+main()
图3 CalendarPadNote类图
代码:
public class CalendarNotePad
{
public static void main(String[] args)
{
new rilijishi();
}
}
(2) Rilijishi类
Rilijishi类是javax.swing包中JFrame的一个子类,并实现了ActionListener,MouseListener
接口,表明该类的主要成员变量和方法的UML图如下。
rilijishi
+year : int<<接口>>+month : int面向对象课程设计报告 第 6 页,共 47 页 ActionLisenter接口1+day : int
+星期几 : int
+calendar:Calendar
+clock:Clock
+calendarpad:CalendarPad<<接口>>+edit:EditMouseListener接口2+picture:Imagecanas
+icon:ImageIcon
+p1:JPanel
+p2:JPanel
+btn1:JButton
+btn2:JButton
+btn3:JButton
+btn4:JButton
+saveFile:JButton
+deleteFile:JButton
+readFile:JButton
+tf1:JTextField
+tf2:JTextField
+date:JTextField[]
+menubar:JMenuBar
+dir:File
+sstring : string
+s:String[]
+str:String[]
+url1:URL
+backgroundmusic:AudioClip+timer:Timer
+rilijishi()
+doMark() : void
+isHaveDailyRecord() : bool+mousePressed() : void +actionPerformed() : void 图4 日历记事本类图
1) 成员变量
?year,month,day和星期几是int型变量,他们的值分别确定年、月、日和月第一天是星
期几。
?calendar是Calendar对象,创建日历时间。 ?calendarpad是Calendarpad的对象,该对象可处理和显示和时间相关的数据。
?edit是Edit的对象,具有编辑、保存、读取和删除日志的功能。
?clock是Clock创建的对象,用来显示时钟。 ?gundong是GunDong的对象,负责创建滚动字幕。 ?btn1,btn2,btn3,btn4,saveFile,deleteFile,readFile是 JButton创建的按钮对象,名字依次为“上
年”、“下年”、“上月”、“下月”、“保存日志”、“删除日志”、“读取日志”。这些按钮都将当
前按钮注册为自己的ActionEvent事件监听。
面向对象课程设计报告 第 7 页,共 47 页
?p1,p2是 JPane创建的对象,用来添加按钮JButton。
?tf1,tf2;是JTextField创建的文本框,用来显示年份和月份。
?date 数组的每个单元是JTextField类创建的对象用来显示日期和文本框。
?menubar是JMenuBar创建的对象,用来显示滚动字幕。
?dir是File创建的文件,用于存放每天的日志。
?timer是javax.swing包中的类创建的计时器
?url1是URL的对象。
?backgroundmusic是java.applet包中类创建AudioClip的对象。
2) 方法
?rilijishi()是构造方法,用于初始化窗口。
?doMark()方法负责对有日志的日期做标记。
?isHaveDailyRecord(int )判断当前日期有没有日志。
?actionPeformed(ActionEvent)是rilijishi类实现ActionListener接口的方法。是
btn1,btn2,btn3,btn4,saveFile,deleteFile,readFile,timer事件监听器,当用户单击其中按
钮时,窗口将执行actionPeformed(ActionEvent)方法的相应操作。
?mousePressed(MouseEvent)方法是rilijishi类实现MouseListener接口的方法。是date
数组中JTextField文本框的事件监听器。但用户在日期文本框上面按下鼠标左键时,窗
口将执行mousePressed(MouseEvent)方法的相应操作。
代码:
class rilijishi extends JFrame implements ActionListener,MouseListener {
int year,month,day,星期几; //year,month,day表示年,月,日
Calendar calendar;
CalendarPad calendarpad; //定义类CalendarPad对象
Clock clock; //定义类Clock对象
Edit edit; //定义类Edit对象
GunDong gundong; //定义类GunDong对象
Imagecanvas picture;
ImageIcon icon;
面向对象课程设计报告 第 8 页,共 47 页
JPanel p1,p2;
JButton btn1,btn2,btn3,btn4;
JButton saveFile,deleteFile,readFile;
JTextField tf1,tf2;
JTextField[] date;
JMenuBar menubar;
File dir;
String sstring;
int slength;
String[] s;
String[] str;
URL url1;
AudioClip backgroundmusic;
Timer timer;
Date datem;
String occourTime;
rilijishi()
{
super("日历记事本");
str=new String[10];
occourTime=new String();
gundong=new GunDong(this);
dir=new File("./dialyRecord");
dir.mkdir(); //创建一个文件夹用于存放日志
calendarpad=new CalendarPad();
面向对象课程设计报告 第 9 页,共 47 页
clock=new Clock();
edit=new Edit();
picture=new Imagecanvas();
timer=new Timer(60000,this);
icon=new ImageIcon("11.jpg"); //创建一个小图标
menubar=new JMenuBar();
btn1=new JButton("上年");
btn2=new JButton("下年");
btn3=new JButton("上月");
btn4=new JButton("下月");
tf1=new JTextField(5);
tf2=new JTextField(5);
saveFile=new JButton("保存日志");
deleteFile=new JButton("删除日志");
readFile=new JButton("读取日志");
date=new JTextField[42];
for(int i=0;i
12)
{
month=1;
}
tf2.setText(""+month);
calendar.set(year,month-1,1);
星期几=calendar.get(Calendar.DAY_OF_WEEK)-1;
edit.setMessage(year,month,1);
calendarpad.getTime(year,month,星期几);
doMark();
}
if(e.getSource()==tf1) //文本框事件,更换年份
{
year=Integer.parseInt(tf1.getText());
month=Integer.parseInt(tf2.getText());
calendar.set(year,month-1,1);
面向对象课程设计报告 第 14 页,共 47 页
星期几=calendar.get(Calendar.DAY_OF_WEEK)-1;
edit.setMessage(year,month,1);
calendarpad.getTime(year,month,星期几);
doMark();
}
if(e.getSource()==tf2) //文本框事件,更换月份
{
year=Integer.parseInt(tf1.getText());
month=Integer.parseInt(tf2.getText());
calendar.set(year,month-1,1);
星期几=calendar.get(Calendar.DAY_OF_WEEK)-1;
edit.setMessage(year,month,1);
calendarpad.getTime(year,month,星期几);
doMark();
}
if(e.getSource()==saveFile) //按钮事件,保存日志
{
edit.savefile(dir,year,month,day);
doMark();
}
if(e.getSource()==readFile) //按钮事件,读取日志
{
edit.readfile(dir,year,month,day);
sstring=edit.ta.getText().trim();
slength=sstring.length()+2;
s=gundong.getStr(sstring,slength);
gundong.repaint();
}
if(e.getSource()==deleteFile) //按钮事件,删除日志
{
面向对象课程设计报告 第 15 页,共 47 页
edit.deletefile(dir,year,month,day);
doMark();
}
if(e.getSource()==timer)
{
int i=0;
String fileName=""+year+""+month+""+day+".txt";
if(isHaveDailyRecord(day))
{
try
{
File file=new File(dir,fileName);
FileReader inOne=new FileReader(file);
BufferedReader inTwo=new BufferedReader(inOne);
String s;
while((s=inTwo.readLine())!=null)
{
StringTokenizer tokenizer=new StringTokenizer(s,"#");
while(tokenizer.hasMoreTokens())
{
try
{
str[i]=tokenizer.nextToken();
i++;
}
catch(Exception eex){}
}
}
inOne.close();
inTwo.close();
面向对象课程设计报告 第 16 页,共 47 页
}
catch(IOException ex){}
datem=new Date(); //获取时间
String string=datem.toString();
occourTime=string.substring(11,16);
url1=getClass().getResource("3.mid");
backgroundmusic=java.applet.Applet.newAudioClip(url1);
for(i=0;i>Edit类是javax.swing包JPanel的一个子类,并实现了+popup:JPopupMenuActionListener接口1ActionListener ,MouseListener,ItemListener接口,表明该类的主要成员变量和方法的UML图+cut:JMenuItem
+copy:JMenuItem如下。
+paste:JMenuItem
<<接口>>+message:JTextField
MouseListener接口2+time:JTextField
+ta:JTextArea
+p1:JPanel
+p2:JPanel<<接口>>+p3:JPanelItemListener接口3+list1:Choice
+list2:Choice
+btn:JButton
+lab1:JLabel
+Size[]:String
+Edit()
+setMessage() : void
+actionPerformed() : void+itemStateChanged() : void+mouseReleased() : void+cut() : void
+copy() : void +paste() : void 图6 Edit类图 +savefile() : void
+deletefile() : void
+readfile() : void1)成员变量
?popup是JPopupMenu创建的对象,用来创建弹出一个菜单项。 ?cut,copy,paste是JMenuItem创建的对象,用来对文本框进行剪切,复制,粘贴功能操作。
?message,time是JTextField创建的对象,message用来显示年,月,日。time用来操作显示
面向对象课程设计报告 第 23 页,共 47 页
事件执行的时间。
?ta是JTextArea创建的对象,创建文本区,设置大小。
?p1,p2,p3是JPanel创建的对象,用于添加按钮和下拉菜单。
?list1,list2是Choise创建的对象,用来创建下拉菜单。
?btn是JButton创建的对象,用来创建按钮。
?lab1是JLable创建的对象,用来存放事件发生的时间。
?Size[]是String类型的数组,用来存放字体大小。
2)方法
?Eidt()是构造函数,用于初始化Edit类的对象。
?setMessage(int,int,int)方法用于设置JTextField对象message上显示的内容。 ?cut()方法用于JTextArea的对像ta上文字的剪切。
?copy()方法用于JTextArea的对像ta上文字的复制。
?paste()方法用于JTextArea的对像ta上文字的粘贴。
?savefile(File,int,int,int)方法用于保存日志。
?readfile(File,int,int,int)方法用于读取日志。
?deletefile(File,int,int,int)方法用于删除日志。
? actionPeformed(ActionEvent)是Edit类实现ActionListener接口的方法。是cut,copy,paste,
saveFile,deleteFile,readFile事件监听器,当用户单击其中按钮时,窗口将执行
actionPeformed(ActionEvent)方法的相应操作。
?mouseReleased(MouseEvent)方法是Edit类实现MouseListener接口的方法。是date数组中
JTextArea文本的事件监听器。当用户在日期文本框上面释放鼠标右键键时,窗口将执行
mousePressed(MouseEvent)方法的相应操作。
?ItemChanged(ItemEvent)方法是Edit类实现ItemListener接口的方法。是list1,list2的的事
件监听器。当下拉菜单的状态转变时,窗口将执行ItemChanged(ItemEvent)方法的相应操作。
代码:
/*
*Edit类用于进行日志的编写和显示
*/
class Edit extends JPanel implements ActionListener ,MouseListener,ItemListener
面向对象课程设计报告 第 24 页,共 47 页
{
JPopupMenu popup;
JMenuItem cut,copy,paste;
JTextField message,time;
JTextArea ta;
JPanel p1,p2,p3;
Choice list1,list2;
JButton btn;
JLabel lab1;
String
Size[]={"5","5","6","6","7","8","9","10","11","12","14","16","18","20","24","28","32","36"}; //存
放字体大小的一位数组
Edit()
{
popup=new JPopupMenu(); //创建一个弹出菜单项
message=new JTextField();
message.setEditable(false);
ta=new JTextArea(5,20);
p1=new JPanel();
p2=new JPanel();
p3=new JPanel();
btn=new JButton("颜色");
lab1=new JLabel("事件发生时间(hh:mm):");
time=new JTextField(10);
list1=new Choice();
list2=new Choice();
面向对象课程设计报告 第 25 页,共 47 页
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment(); //获取计算机上所有字体名
String fontname[]=ge.getAvailableFontFamilyNames(); //存放字体名的一维数组
for(int i=0;i>
+secondtime:TimerActionListener接口4
+hour : int
+minute : int
+second : intCanvas+b : int
+c : int
+hourline:Line2D
+minuteline:Line2D
-secondline:Line2D
-thread:Thread
-url:URL
-clip:AudioClip
-piontSX[] : double
-piontSY[] : double
-piontMX[] : double
-piontMY[] : double
-piontHX[] : double
-piontHY[] : double
+Clock()
+paint() : void
+actionPerformed() : bool
图7 Clock类图
1)成员变量
?date是Date创建的一个对象,负责封装本地时间。
?secondTime是javax.swing包中的类创建的计时器
?hour,minute,second是int型数据,其值分别代表“小时”,“分钟”,“秒钟”。
?hourLine,minuteLine,secondLine是Line2D对象,分别负责绘画“时钟”,“分钟”,“秒钟”
?piontSX,piontSY是double型数组,其单元值表示秒钟的端点坐标。 ?piontMX,piontMY是double型数组,其单元值表示分钟的端点坐标。 ?piontHX,piontHY是double型数组,其单元值表示时钟的端点坐标。 ?url是URLd的对象。
?clip是java.applet包中类创建AudioClip的对象。
面向对象课程设计报告 第 35 页,共 47 页
2)方法
?Clock()是构造函数,用来创建clock对象。
?paint(Graphics)方法是负责在画布上画出时钟。
?actionPeformed(ActionEvent)是Clock类实现ActionListener接口的方法。是secondTime事件
监听器,当用户单击其中按钮时,窗口将执行actionPeformed(ActionEvent)方法的相应操作。
代码:
class Clock extends Canvas implements ActionListener //刻画时钟 {
Date date;
Timer secondtime;
int hour,minute,second;
int a,b,c;
Line2D hourline,minuteline,secondline;
URL url;
AudioClip clip;
double piontSX[]=new double[60]; //用来表示秒钟端点的坐标
double piontSY[]=new double[60];
double piontMX[]=new double[60]; //用来表示分钟端点的坐标
double piontMY[]=new double[60];
double piontHX[]=new double[60]; //用来表示时钟端点的坐标
double piontHY[]=new double[60];
Clock()
{
secondtime=new Timer(1000,this);
piontSX[0]=0; //12点秒钟坐标
piontSY[0]=-100;
piontMX[0]=0; //12点分钟坐标
piontMY[0]=-90;
面向对象课程设计报告 第 36 页,共 47 页
piontHX[0]=0; //12点时钟坐标
piontHY[0]=-70;
double angle=6*Math.PI/180;
for(int i=0;i<59;i++) //计算出各数组中的坐标
{
piontSX[i+1]=piontSX[i]*Math.cos(angle)-Math.sin(angle)*piontSY[i];
piontSY[i+1]=piontSY[i]*Math.cos(angle)+piontSX[i]*Math.sin(angle);
piontMX[i+1]=piontMX[i]*Math.cos(angle)-Math.sin(angle)*piontMY[i];
piontMY[i+1]=piontMY[i]*Math.cos(angle)+piontMX[i]*Math.sin(angle);
piontHX[i+1]=piontHX[i]*Math.cos(angle)-Math.sin(angle)*piontHY[i];
piontHY[i+1]=piontHY[i]*Math.cos(angle)+piontHX[i]*Math.sin(angle);
}
for(int i=0;i<60;i++) //坐标平移
{
piontSX[i]=piontSX[i]+120;
piontSY[i]=piontSY[i]+120;
piontMX[i]=piontMX[i]+120;
piontMY[i]=piontMY[i]+120;
piontHX[i]=piontHX[i]+120;
piontHY[i]=piontHY[i]+120;
}
secondline=new Line2D.Double(0,0,0,0);
minuteline=new Line2D.Double(0,0,0,0);
hourline=new Line2D.Double(0,0,0,0);
secondtime.start();
}
public void paint(Graphics g)
{
面向对象课程设计报告 第 37 页,共 47 页
for(int i=0;i<60;i++)
{
int m=(int)piontSX[i];
int n=(int)piontSY[i];
if(i%5==0)
{
g.setColor(Color.red);
g.fillOval(m-4,n-4,8,8);
}
else
{
g.setColor(Color.cyan);
g.fillOval(m-2,n-2,4,4);
}
}
g.fillOval(115,115,10,10);
Graphics2D g_2d=(Graphics2D)g; //刻画秒钟
g_2d.setColor(Color.red);
g_2d.draw(secondline);
BasicStroke bs=new BasicStroke(3f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER); //
刻画分钟
g_2d.setStroke(bs);
g_2d.setColor(Color.blue);
g_2d.draw(minuteline);
bs=new BasicStroke(6f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER); //刻画时钟
g_2d.setStroke(bs);
g_2d.setColor(Color.green);
面向对象课程设计报告 第 38 页,共 47 页
g_2d.draw(hourline);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==secondtime)
{
date=new Date();
String s=date.toString();
hour=Integer.parseInt(s.substring(11,13)); //获取时间中的小时
minute=Integer.parseInt(s.substring(14,16)); //获取时间中的分钟
second=Integer.parseInt(s.substring(17,19)); //获取时间中的秒钟
int h=hour%12;
a=second;
b=minute;
c=h*5+minute/12;
secondline.setLine(120,120,(int)piontSX[a],(int)piontSY[a]);
minuteline.setLine(120,120,(int)piontMX[b],(int)piontMY[b]);
hourline.setLine(120,120,(int)piontHX[c],(int)piontHY[c]);
repaint();
if(minute==0&&second==0) //在整点时报时,想起音乐
{
url=getClass().getResource("天空之城.mid");
clip=java.applet.Applet.newAudioClip(url);
clip.play();
}
}
}
}
面向对象课程设计报告 第 39 页,共 47 页
(6)Imagecanvas类
Imagecanva类是Canvas的一个子类,表明该类的主要成员变量和方法的UML图如下。
Imagecanvas
Canvas+tool:Toolkit
+image:Image
+paint() : void
+Imagecanvas() : void
图8 Imagecanvas类图
1) 成员变量
?tool是Toolkit创建的对象,负责创建image对象。
?image是Image对象。
2) 方法
?Imagecanvas()是构造函数,用于创建Imagecanvas对象。
?paint(Graphics)方法用于在画布上画出图片。 代码:
class Imagecanvas extends Canvas
{
Toolkit tool;
Image image;
Imagecanvas()
{
setSize(200,200);
tool=getToolkit();
image=tool.getImage("夏天.jpg");
}
面向对象课程设计报告 第 40 页,共 47 页
public void paint(Graphics g)
{
g.drawImage(image,0,0,image.getWidth(this),image.getHeight(this),this);
}
}
(7)GunDong类
GunDong类是Canvas的一个子类,并实现了Runnable接口,表明该类的主要成员变量和方法的UML图如
下。
DunDong<<接口>>
Runnable接口1+i : int
+mf:rilijishi
+thread:ThreadCanvas+GunDong()
+paint() : void
+getStr()
图9 GunDong类图
1)成员变量
?i是int型变量,用于计数。
?mf是类rilijishi创建的对象。
?thread是Thread创建的线程。
2)方法
?GunDong(rilijishi)是构造函数,创建GunDong的对象。
?paint(Graphics)方法是负责绘画滚动字幕。
?getStr(String ,int )方法是用于创建字符串数组。 代码:
/*
*GunDongk类,显示一个滚动字幕
*/
class GunDong extends Canvas implements Runnable
面向对象课程设计报告 第 41 页,共 47 页
{
int i=0;
rilijishi mf;
Thread thread;
GunDong(rilijishi mf)
{
this.mf=mf;
setSize(30,28);
thread=new Thread(this);
thread.start();
}
public void run()
{
while(true)
{
try
{
thread.sleep(500);
}
catch(InterruptedException e){}
this.repaint(100);
}
}
public void paint(Graphics g)
{
Font f=new Font("",Font.BOLD,16);
g.setFont(f);
g.setColor(Color.RED);
if(mf.s == null) return;
面向对象课程设计报告 第 42 页,共 47 页
g.drawString(mf.s[i++],10,20);
i%=mf.slength;
}
public static String[] getStr(String s,int length)
{
String newstr=s;
String[] slist=new String[length];
if(length>s.length())
{
for(int i=0;i>+day : int+popup:JPopupMenuActionListener接口1+星期几 : int接口1+cut:JMenuItem+calendar:Calendar+copy:JMenuItem+clock:Clock+paste:JMenuItem+calendarpad:CalendarPad<<接口>>Imagecanvas+message:JTextField+edit:EditCanvasMouseListener接口2接口2+time:JTextField+tool:Toolkit+picture:Imagecanas+ta:JTextArea+image:Image+icon:ImageIcon+p1:JPanel+paint() : void+p1:JPanel+p2:JPanel+Imagecanvas() : void<<接口>>+p2:JPanel+p3:JPanelItemListener接口3+btn1:JButton+list1:Choice+btn2:JButton+list2:Choice+btn3:JButton+btn:JButton+btn4:JButton+lab1:JLabel+saveFile:JButton+Size[]:String+deleteFile:JButton+Edit()+readFile:JButtonCalendarPad+setMessage() : void+tf1:JTextField +actionPerformed() : void+MonthDay : int+tf2:JTextField +itemStateChanged() : void+星期:StringJPanel+date:JTextField[]+mouseReleased() : void+title[]:JLabel+menubar:JMenuBar+cut() : void+date[]:JTextField+dir:File+copy() : void+sstring : string+CalendarPad()+paste() : void+s:String[]+setShowDay() : void+savefile() : void+str:String[]+getTime() : void+deletefile() : void+url1:URL+readfile() : void+backgroundmusic:AudioClipClock+timer:Timer
+rilijishi()+date:Date+doMark() : void+a : int+isHaveDailyRecord() : bool+backgroundAudio:BackgroundAudio+mousePressed() : void+secondtime:Timer+actionPerformed() : void+hour : int+minute : int+second : int<<接口>>+b : int接口1RunnableDunDong+c : int+i : int+hourline:Line2DCanvas+mf:rilijishi+minuteline:Line2D+thread:Thread-secondline:Line2D-thread:Thread+GunDong()-url:URL+paint() : void-clip:AudioClip+getStr()-piontSX[] : double-piontSY[] : double<<接口>>-piontMX[] : doubleActionListener接口4-piontMY[] : double-piontHX[] : double-piontHY[] : double+Clock()+paint() : void+actionPerformed() : bool
图10 整体UML类图
用户手册
本程序名为日历记事本,主要用于用户进行记事。
面向对象课程设计报告 第 45 页,共 47 页 ? 首先是日历部分,有四个按钮“上年”,“下年”,“上月”,“下月”四个按钮,按下分别表示
时间加一年,减一年,加一月,减一月,或者在文本框中输入年、月,并按下enter键,则
日历也会显示相应日期。
另外在日期上左击某一天,右边的上方的文本框会显示出当天的日期。 ? 其次是文本编辑部分,点击日历某一天后,就可以在文本区进行日志编写,文本区上的文字
可以设置字体、大小、颜色;在事件发生时间中输入这个事件发生的时间,则在那天的那个
时间,日历记事本就会响起一段音乐,提示你有事件。
? 日志保存好了之后,日历当天就会添加一个小图标;日志删除了后,当天日历上的图标就会
消失;读取日志后,窗口会以滚动字幕的形式显示日志的内容。
? 至于时钟,会在整点的时候播放一段音乐。
4(代码调试
面向对象课程设计报告 第 46 页,共 47 页
5. 软件发布
面向对象课程设计报告 第 47 页,共 47 页
6(课程小结