java课程设计日记本.docx
《java课程设计日记本.docx》由会员分享,可在线阅读,更多相关《java课程设计日记本.docx(22页珍藏版)》请在冰点文库上搜索。
java课程设计日记本
1需求分析
日记本是很平常的东西,很多人都有记日记的习惯,有人记账,有人记事、有人记下心情。
随着计算机技术的发展,很多家庭都买了电脑,开始上网,开始使用电脑来办公、打字等。
所写现在也有很多的人在使用电脑写小说,写博客等,受此启发我就萌生了编写一个日记本,用电脑来写日记的想法。
很多事我们不想忘记,于是写进日记本里,多年后翻出来再看看,很是惬意。
大多数人都使用的是纸质的日记本,这中日记很难保存,容易丢失,也容易遭到水浸等物理破坏,这样我们的日记就丢了。
同纸质的日记本相比较,用软件日记本不仅环保,而且安全方便,不怕被别人偷看。
软件日记本可以很方便的携带只要存在电脑硬盘或者U盘中就可以了。
1.1用户分析
这个软件面向的用户是拥有个人电脑,而其具有写日记的习惯的人。
用户使用的软件必须简单容易使用,在此基础上尽可能多的提供人性化功能,丰富软件的内涵。
同时软件必须尽量保证不会因用户的不当操作而使用户受到严重的经济、财产、精神损失。
软件必须具有很强的可靠性,不会无故终止运行、死机、退出等。
1.1.1用户要求具备以下基本功能:
a编辑日记:
包括改变字体大小、改变字体颜色等。
b管理日记:
包括保存及删除日记、按日期分组日记等。
1.1.2除以上功能外,可另曾特色功能:
a音乐播放的功能。
b编辑背景变换的功能。
c身份验证的功能。
d日记文件加密存储的功能。
1.2软件界面与接口需求
1.2.1界面需求
界面的原则要求:
方便、简洁、美观、一致等。
整个界面要保持友好、简易的风格。
a输入设备:
键盘、鼠标。
b输出设备:
显示器。
c显示风格:
应用程序窗口界面。
1.2.2接口需求
软件功能比较简单,暂时不需要接口方面的需求。
1.3目标软件其他需求
a.运行环境需求:
要求安装JavaDevelopmentKit(JDK)v1.5或以上版本环境。
b.进度要求:
2009年6月底必须完成开发,并通过测试。
2概要设计
本课程设计是一个实用的日记本程序,主要实现日记撰写、按月份、日期分类日记、字体设置、身份认证、音乐播放、背景随机变化等。
一个普通的日记本无需使用数据库,如果要使用数据库则没有适合的数据库可以使用,桌面数据库太小不能满足需求,而其他大型数据库则又昂贵而不合算,所写我要开发的日记将以文本文件(windows下的.txt文件格式)来存储,这样做的好处是显而易见的。
2.1登陆验证
日记是个人的隐私,通常日记的拥有者不希望他人看到自己所写的日记,为了实现基本的保密,程序进行了用户身份认证,来确认是否有权使用。
认证流程如下:
图2-1身份验证功能流程
2.2日记本各部分功能
日记本的基本功能就是撰写日记,对写好的日记要能够进行保存、修改、删除等操作。
这些都是一个日记本所具有的最基本的功能,除此之外本日记本还增加了其他功能。
具体模块功能有:
a编辑日记:
包括改变字体大小、改变字体颜色等。
b管理日记:
包括保存及删除日记、按日期分组日记等。
c音乐播放的功能。
d编辑背景变换的功能。
e身份验证的功能。
f日记文件加密存储的功能。
具体功能层出图如下所示:
图2-2日记本层次功能
3详细设计
下面是程序的全部代码与详细注释。
/***************************************
*程序文件名称:
Diary.java
*功能:
日历本
***************************************/
packagediary;
importjavax.swing.*;
importjavax.swing.tree.*;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.event.*;
importjava.io.*;
importsun.audio.*;
importjava.util.*;
//日记本类
classRememberextendsJFrameimplementsTreeSelectionListener,ActionListener
{
JTreetree=null;
inti=0,r=255,g=255,b=255;
JTextAreatext=newJTextArea("",20,30);
DefaultMutableTreeNoderoot;
DefaultMutableTreeNodemonth[]=newDefaultMutableTreeNode[13];//对象数组
JButtonb_save=newJButton("保存"),
b_del=newJButton("删除"),
b_fontCommen=newJButton("普通"),
b_fontBig=newJButton("大字"),
b_fontRed=newJButton("红色"),
b_fontBlue=newJButton("蓝色"),
b_music_on=newJButton("音乐ON/OFF"),
b_music_n=newJButton("上首"),
b_music_p=newJButton("下首"),
b_bg=newJButton("背景");
StringDiaryRoot="diaries\\";
intmusic_on=0,m_now=0;;
String[]musics={"Alone.wav",
"Dreaming.wav",
"dyinginthesun.wav",
"EndCredits.wav",
"lolita.wav",
"Numb.wav",
"ThePary.wav",
"小茉莉.wav"};
InputStreamis=null;
//构造方法,完成界面及树结点初始化,音乐文件列表初始化
Remember()
{
Containercon=getContentPane();
DefaultMutableTreeNoderoot=newDefaultMutableTreeNode("日记本");
//设置以月份为节点的树,不考虑闰年的影响。
for(i=1;i<=12;i++)
{
month[i]=newDefaultMutableTreeNode(""+i+"月");
root.add(month[i]);
}
//设置不同月份的节点
for(i=1;i<=12;i++)
{
//处理有31天的月份
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
{
for(intj=1;j<=31;j++){
Strings1=month[i].toString();
Strings2=j+"日.txt";
Filefile=newFile(DiaryRoot+s1+s2);
//如果这一天写了日记则相应节点后面添加一个“*”来标志
if(file.exists()==true)
month[i].add(newDefaultMutableTreeNode(j+"日*"));
else
month[i].add(newDefaultMutableTreeNode(j+"日"));
}
}
//处理有30天的月份
elseif(i==4||i==6||i==9||i==11)
{
for(intj=1;j<=30;j++){
Strings1=month[i].toString();
Strings2=j+"日.txt";
Filefile=newFile(DiaryRoot+s1+s2);
//如果这一天写了日记则相应节点后面添加一个“*”来标志
if(file.exists()==true)
month[i].add(newDefaultMutableTreeNode(j+"日*"));
else
month[i].add(newDefaultMutableTreeNode(j+"日"));
}
}
//处理有28天的月份
else
{
for(intj=1;j<=28;j++){
Strings1=month[i].toString();
Strings2=j+"日.txt";
Filefile=newFile(DiaryRoot+s1+s2);
//如果这一天写了日记则相应节点后面添加一个“*”来标志
if(file.exists()==true)
month[i].add(newDefaultMutableTreeNode(j+"日*"));
else
month[i].add(newDefaultMutableTreeNode(j+"日"));
}
}
}
//设置监听
b_save.addActionListener(this);
b_del.addActionListener(this);
b_music_on.addActionListener(this);
b_music_n.addActionListener(this);
b_music_p.addActionListener(this);
b_fontRed.addActionListener(this);
b_fontCommen.addActionListener(this);
b_fontBig.addActionListener(this);
b_fontBlue.addActionListener(this);
b_bg.addActionListener(this);
//创建树及其面板
tree=newJTree(root);
JPanelp=newJPanel();
//设置边界布局
p.setLayout(newBorderLayout());
JScrollPanescrollpane_1=newJScrollPane(text);
//带滚动条的面板放置到中间,可以占据最大空间位置
p.add(scrollpane_1,BorderLayout.CENTER);
//设置面板,放置"保存"和"删除"按钮等按钮,面板放在上部
JPanelp_1=newJPanel();
p_1.add(b_save);
p_1.add(b_del);
p_1.add(b_fontCommen);
p_1.add(b_fontBig);
p_1.add(b_fontRed);
p_1.add(b_fontBlue);
p_1.add(b_music_on);
p_1.add(b_music_n);
p_1.add(b_music_p);
p_1.add(b_bg);
//设置布局
p.add(p_1,BorderLayout.NORTH);
JScrollPanescrollpane_2=newJScrollPane(tree);
JSplitPanesplitpane=newJSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,scrollpane_2,p);
tree.addTreeSelectionListener(this);
con.add(splitpane);
//设置窗体适配器,关闭功能
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);}});
setVisible(true);
setBounds(100,150,500,600);
}
//处理树节点事件
publicvoidvalueChanged(TreeSelectionEvente)
{
//清空文本区中的内容
text.setText("");
if(e.getSource()==tree)
{
//定义被选中的节点
DefaultMutableTreeNodenode=
(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
//如果是叶节点,则可以对文件进行操作
if(node.isLeaf())
{
//日记以“-月-日.txt”的形式存储,所以要消除“*”号的影响
Stringstr=node.toString();
str=str.substring(0,str.length()-1);
for(inti=0;i<=12;i++)
{
if(node.getParent()==month[i])
{
try{
Stringtemp=null;
//打开以节点(“*”号影响已经消除)所定义的文本为文件名的文件
Filef=newFile(DiaryRoot+node.getParent().toString()+str+".txt");
//建立文本文件输入流,读取文件
FileReaderfile=newFileReader(f);
BufferedReaderin=newBufferedReader(file);
//将读到的文件内容添加到文本区中,按行读入
while((temp=in.readLine())!
=null)
text.append(temp+'\n');
file.close();
in.close();
}
catch(FileNotFoundExceptione1){}
catch(IOExceptione1){}
}
}
}
}
}
//处理按钮事件
publicvoidactionPerformed(ActionEvente)
{
//处理"保存"按钮的事件
if(e.getSource()==b_save)
{
DefaultMutableTreeNodenode=
(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
Stringstr=node.toString();
//保存文件时去除“*”号
str=str.replace("*","");
//如果是叶节点,则可以对文件进行操作
if(node.isLeaf())
{
//保存文件
try{
//建立以节点所定义的文本为文件名的文件
Filef=newFile(DiaryRoot+node.getParent().toString()+str+".txt");
//建立文本文件输出流
FileWritertofile=newFileWriter(f);
BufferedWriterout=newBufferedWriter(tofile);
//将文本区中的内容写到文件缓冲区
out.write(text.getText(),0,(text.getText()).length());
//将缓冲区中的内容写到文件
out.flush();
tofile.close();
out.close();
}
catch(FileNotFoundExceptione1){}
catch(IOExceptione1){}
}
}
//处理点出"删除"按钮的事件
elseif(e.getSource()==b_del)
{
DefaultMutableTreeNodenode=
(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
Stringstr=node.toString();
//删除文件时消除“*”好影响
str=str.replace("*","");
if(node.isLeaf())
{
try{
//把删除命令写到一个批处理文件中
Filef=newFile(DiaryRoot+node.getParent().toString()+str+".txt");
FileWritertofile=newFileWriter("del.bat");
BufferedWriterout=newBufferedWriter(tofile);
Stringtemp1="del"+f.getAbsoluteFile().toString();
out.write(temp1,0,temp1.length());
out.newLine();
out.flush();
tofile.close();
out.close();
}
catch(IOExceptione1){}
}
//调用执行删除文件的方法,del()执行上面创建的批处理文件del.bat
del();
}
//处理"大字"按钮事件
elseif(e.getSource()==b_fontBig)
{
text.setFont(newFont("Serif",1,18));
}
//处理"普通"按钮事件
elseif(e.getSource()==b_fontCommen)
{
text.setFont(newFont("Serif",0,12));
text.setForeground(Color.black);
}
//处理"红色"按钮事件
elseif(e.getSource()==b_fontRed)
{
text.setForeground(Color.red);
}
//处理"蓝色"按钮事件
elseif(e.getSource()==b_fontBlue)
{
text.setForeground(Color.blue);
}
//处理"音乐ON"按钮事件
elseif(e.getSource()==b_music_on)
{
//判断音乐开关变量music_on
if(music_on==0)music_on=1;
elseif(music_on==1)music_on=0;
try
{
//如果正在播放时被按下,就停止当前正在播放的音乐
AudioPlayer.player.stop(is);
//用输入流创建一个AudioStream对象,并打开给对象
is=getClass().getResource("sounds\\"+musics[m_now]).openStream();
if(music_on==1)
{
//播放音乐,播放完毕后关闭
AudioPlayer.player.start(is);
while(is==null)
AudioPlayer.player.stop(is);
}
}
catch(IOExceptione1){}
}
//处理"上首"、"下首"按钮事件
if(e.getSource()==b_music_n)
{
//实现循环,当到达最后时可以返回到第一个音乐
m_now=(m_now+1)%6;
try
{
//关闭正在播放的音乐,重新创建并播放新的音乐
AudioPlayer.player.stop(is);
is=getClass().getResource("sounds\\"+musics[m_now]).openStream();
if(music_on==1)
{
AudioPlayer.player.start(is);
while(is==null)
AudioPlayer.player.stop(is);
}
}
catch(IOExceptione1){}
}
if(e.getSource()==b_music_p)
{
m_now=(m_now-1)%6;
try
{
//关闭正在播放的音乐,重新创建并播放新的音乐
AudioPlayer.player.stop(is);
is=getClass().getResource("sounds\\"+musics[m_now]).openStream();
if(music_on==1)
{
AudioPlayer.player.start(is);
while(is==null)
AudioPlayer.player.stop(is);
}
}
catch(IOExceptione1){}
}
//处理"背景"按钮事件
elseif(e.getSource()==b_bg)
{
//随机变化背景颜色
//随机+-操作,当op>0.5时做减法负责做加法,
doubleop=Math.random();
doublec=Math.random()*10;
if(op>0.5)
{
//使r,g,b三个标志RGB的变量减小一个随机的大小小在0-50之间的数
if(c<4)r-=Math.random()*50;
if(c>4&&c<7)g-=Math.random()*50;
if(c>7)b-=Math.random()*50;
}
if(op<=0.5)
{
//使r,g,b三个标志RGB的变量增加一个随机的大小小在0-50之间的数
if(c<4)r-=Math.random()*50;
if(c>4&&c<7)g-=Math.random()*50;
if(c>7)b-=Math.random()*50;
}
text.setBackground(newColor(r,g,b));
}
}
//删除文件
voiddel()
{
//