1、软 件 学 院课程设计报告书课程名称 面向对象课程设计 设计题目 记事本程序 专业班级 xx 学 号 xx 姓 名 xx 指导教师 徐娇月 201x 年 6 月目录1 设计 时间 .12 设计目的 .13 设计任务 14 设计内容 .14.1 需求分析 .14.1.1 需求说明 14.1.2 功能需求 14.2 概要设计 24.2.1 程序设计思路 24.2.2 程序运行环境及界面 24.3 功能模块设计 34.3.1 功能模块说明图 34.3.2 自定义类及接口说明 .44.3.3 类中方法介绍 .54.4 异常处理 104.5 程序运行与调试分析 104.5.1.开始调试 .104.5.2
2、 各菜单实现 114.5.3 退出 .155 总结与展望 .16程序源代码: .17参考 文献 .2411 设计时间2011-06-05 至 2011-06-122 设计目的记事本主要是对文字进行编辑处理的软件。能进行新建、打开、保存等功能。另外还可以根据用户的需要查找替换相应的文字,实现编辑功能。通过面向对象程序设计对自己所学过的的知识加以掌握和运用。巩固面向对象设计理念的理解,熟练 Java 设计语言的运用。3 设计任务记事本程序。要求如下:(1)使用图形用户界面实现。(2)必须有菜单、弹出式对话框组件的实现。(3)能实现文字编辑、保存、另存为、查找、替换功能,其它功能可自行丰富。(4)系
3、统使用的 GUI 组件不得少于 5 种,越全面越好,但要合适(和谐界面) 。提示:使用文件输入输出流。4 设计内容 4.1 需求分析4.1.1 需求说明现在网络上各种文档编辑器数不胜数,有 EmEditor , UEStudio ,Word。功能也是应有尽有,有能改变字体的,有能改变文字颜色的。但是,这些软件又存在各种各样的瑕疵或问题:有的文件体积相对于一般文字编辑来说太大;有的功能太繁杂,使初级使用者一时难以掌握。仅从日常应用方面来说,一个文本编辑器只需一些简单实用的功能就够了。本程序设计就是依照这样一种使用需要设计了一个简单的实现特定功能的记事本程序。4.1.2 功能需求本程序要构建的记事
4、本程序参照了 Windows 操作系统的记事本工具,其功能有以下几个方面:2(1).菜单中有“文件” , “编辑” , “作者”三个主菜单。(2).“文件”有“新建” “打开” “保存” “退出”四个子菜单:分别用于新建文件,打开文件,保存文件,退出记事本。(3).“编辑菜单”有“查找、替换、时间日期”功能。(4).“作者”菜单中有关于记事本程序的作者信息。4.2 概要设计4.2.1 程序设计思路Java 记事本程序是:图形界面、流与文件等技术的综合应用。图形界面的实现:考虑到简单、实用、高效等特点,大部分选择了 awt 来完成实现,其中也有 swing 组件。文本编辑区就选用了 TaxtAr
5、ea 作为主要的部件。文件操作的实现:利用了字符文件流 FileReader 和 FileWriter 类来实现。由于 Java 的特性,可能用任何一个编辑器来编辑,于是就将 Windows 中的记事本作为模仿对象,根据实现情况删减了其中的一些功能。在设计类的时候,考虑到简单明了,就用了三个类,一个主类、一个类设计构造函数实现监听接口作为程序的整体框架,一个类设计构造函数实现查找替换功能。所有的对象和方法都是在默认属性类中创建和实现的,以及为各组件注册事件监听程序也是在默认属性类中实现的。主类完成对象的实例化及显示。这们设计的优点是:条理清晰,容易理解,容易修改。这样设计的缺点是:不利于共享类
6、中的方法。4.2.2 程序运行环境及界面1.操作系统:Windows XP2.开发语言: JAVA3.开发工具: MyEclipse4.运行界面: 如图 4-1 所示3图 4-1 运行界面4.3 功能模块设计4.3.1 功能模块说明图首先创建一个名为 NoteBook 的类并继承 Frame 类实现监听接口作为最底层的容器(具体过程在“4.3.2 自定义类及接口说明”作说明) 。菜单栏中有“文件” 、 “编辑” 、 “作者”三项菜单,分别添加的相应的项,各实现其功能。如图 4-2 所示图 4-2 功能模块说明图44.3.2 自定义类及接口说明1.MyFindDialog 类 继承 Dialog
7、 类 实现 ActionListene 接口 实现查找替换功能class MyFindDialog extends Dialog implements ActionListener定义查找和替换的标签和文本域Label lFind=new Label(“查找字符串“);Label lReplace=new Label(“替换字符串“);TextField tFind=new TextField(10);TextField tReplace=new TextField(10);Button bFind=new Button(“查找“);Button bReplace=new Button(“替换
8、“);TextArea ta;2.Note 类 继承 Frame 类 实现 ActionListener 接口 作为程序的整体框架class Note extends Frame implements ActionListener定义菜单,菜单项,对话框等。MenuBar mb = new MenuBar();Menu item1=new Menu(“文件“);MenuItem subitem11=new MenuItem(“新建“,new MenuShortcut(KeyEvent.VK_A, false);MenuItem subitem23=new MenuItem(“时间日期“);Me
9、nu item3=new Menu(“作者“);MenuItem subitem31=new MenuItem(“作者信息“);5MyFindDialog findDlg=new MyFindDialog(this,tf);3.NoteBook 类 主类,完成对象的实例化及显示public class NoteBookMain 方法中实例化 news Note();显示界面。4.3.3 类中方法介绍1.MyFindDialog 类(1)构造方法:MyFindDialog(Frame owner,TextArea ta)设计构造函数,带有指定的所有者框架和标题。方法部分内容如下:设置大小,并添加
10、类中定义的各个组件。super(owner,“查找“); this.ta=ta;setLayout(null);lFind.setBounds(10,30,80,20);lReplace.setBounds(10,70,80,20);add(bReplace);setResizable(false);bFind.addActionListener(this);bReplace.addActionListener(this);实现关闭对话框时的监听。addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent
11、 e)MyFindDialog.this.dispose(););(2)显示查找和替换的对话框方法:showFind()和 showReplace()6方法部分内容如下:调用时显示查找对话框, public void showFind()setTitle(“查找“);setSize(280,60);setVisible(true);调用时显示查找替换对话框public void showReplace()setTitle(“查找替换“);setSize(280,110);setVisible(true);(3)查找方法: private void find()方法部分内容如下: String
12、text=ta.getText();String str=tFind.getText();int end=text.length();int len=str.length();int start=ta.getSelectionEnd(); /获取此文本组件中选定文本的结束位置。if(start=end) start=0;for(;start=end-len;start+)if(text.substring(start,start+len).equals(str)ta.setSelectionStart(start);ta.setSelectionEnd(start+len);return;/若
13、找不到待查字符串,则将光标置于末尾ta.setSelectionStart(end);7ta.setSelectionEnd(end);(4)替换方法: private void replace()方法部分内容如下:String str=tReplace.getText();if(ta.getSelectedText().equals(tFind.getText()/用指定替换文本替换指定开始位置与结束位置之间的文本ta.replaceRange(str,ta.getSelectionStart(),ta.getSelectionEnd();else find();public void ac
14、tionPerformed(ActionEvent e) if(e.getSource()=bFind)find();else if(e.getSource()=bReplace)replace();2.Note 类(1)构造方法:Note ()方法部分内容如下:设置标题,大小super(“记事本“);setBounds(100,100,600,400);添加组件add(tf);setMenuBar(mb);mb.add(item1);item1.add(subitem11);添加指定的操作侦听器,以从此菜单项接收操作事件。subitem11.addActionListener(this);8
15、subitem31.addActionListener(this);setVisible(true); addWindowListener(new WindowAdapter()(2)窗口关闭监听方法: void windowClosing(WindowEvent e)方法部分内容如下:关闭时提示是否退出。int option=JOptionPane.showConfirmDialog( Note.this, “确定退出程序? “, “提示 “,JOptionPane.YES_NO_CANCEL_OPTION); if(option=JOptionPane.YES_OPTION) if(e.g
16、etWindow()=Note.this) System.exit(0); else return; );(3)发生操作时调用该方法:public void actionPerformed(ActionEvent e)方法部分内容如下:/-新建 -if(e.getSource()=subitem11) tf.setText(“); /-打开 -if(e.getSource()=subitem12) /-保存-if(e.getSource()=subitem13)9 /-另存为 -if(e.getSource()=subitem14) /-退出 -if(e.getSource()=subitem
17、15) /-查找 -if(e.getSource()=subitem21) findDlg.showFind();/-替换-if(e.getSource()=subitem22)findDlg.showReplace(); /-日期-if(e.getSource()=subitem23) /-作者-if(e.getSource()=subitem31)tf.setText(“课程名称: java 课程设计 “+n+“学院: 软件工程学院 10“+n+“班级: 嵌入式系 09-01 班 “+n+“姓名: 陈 冲 “+n+“学号: 0920010102“); 3.NoteBook 类主类包含 ma
18、in 方法,实例化 news Note();显示界面。public static void main(String args)new Note();4.4 异常处理在运行程序代码是有可能会产生异常情况或异常事件,为了避免这种情况,就需要在程序中用到 Java 异常处理机制。本程序中选用的异常处理机制是 try,catch 。捕获处理异常的第一步是用 try 选定要监控的异常范围,try 后跟随 catch 代码块捕获异常“ex.printStackTrace();”语句在命令行打印异常信息在程序中出错的位置及原因。例如“打开”监听中运用到异常处理。其它的地方于此类似。tryFile file=
19、jc.getSelectedFile();FileInputStream fis=new FileInputStream(file);byte buf=new byte10*1024;int len=fis.read(buf);tf.append(new String(buf,0,len);catch(Exception ex)ex.printStackTrace();4.5 程序运行与调试分析4.5.1.开始调试出现记事本界面并输入几行文字。如图 4-311图 4-3 调试运行界面4.5.2 各菜单实现1文件菜单。如图 4-4 所示12图 4-4 文件菜单(1)打开文件界面。如图 4-5图
20、4-5 “打开”对话框13(2)保存文件界面。如图 4-6图 4-6 保存对话框(3)退出程序界面。如图 4-714图 4-7 退出对话框2 编辑菜单。如图 4-8图 4-8 编辑菜单(1) 查找界面。如图 4-915图 4-9 查找对话框(2)替换界面。如图 4-1016图 4-10 超找替换对话框(3)显示当时时间。如图 4-11图 4-11 显示实践3 作者菜单。如图 4-12174-12 作者菜单(1)显示作者信息。如图 4-13图 4-13 显示作者信息184.5.3 退出提示是否确定退出。如图 4-14图 4-14 退出程序5 总结与展望经过差不多一个星期的努力,基本上完成我的 J
21、ava 课程设计简单的记事本程序,基本上实现了我在需求分析时所预期的功能。通过这次的课程设计,使将我从书本上学习到的理论知识用到了实践上,从而进一步巩固和丰富了我所学过的知识,让我更深层次地认识到Java 及其强大的功能。同时,做这门课程设计也进一步加强了我的动手能力。为了完成好这次课程设计,我提前做了较多的准备,一边上网查找相关资料,另一方面查阅相关书籍。在这过程中也无形中锻炼了我的思维分析、遇到问题及想方设法通过各种途径解决问题的能力。但是,设计过程中也存在一些问题,例如 java 程序设计的封装性在个人的设计中没有足以体现,更为理想的是将各个模块封装成类,方便共享调用,但是由于本人知识浅
22、陋以及时间等其他原因,使得这些想法没有实现,这是这次课程设计的一点遗憾。19程序源代码:import java.awt.*; import java.awt.event.*;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.i
23、o.IOException;import java.util.Calendar;import javax.swing.JFileChooser;import javax.swing.JOptionPane;/查找 替换 类MyFindDialogclass MyFindDialog extends Dialog implements ActionListenerLabel lFind=new Label(“查找字符串“);Label lReplace=new Label(“替换字符串“);TextField tFind=new TextField(10);TextField tReplace=
24、new TextField(10);Button bFind=new Button(“查找“);Button bReplace=new Button(“替换“);TextArea ta;/构造函数public MyFindDialog(Frame owner,TextArea ta)super(owner,“查找“);/构造一个初始时不可见、无模式的 Dialog,带有指定的所有者框架和标题。this.ta=ta;setLayout(null);lFind.setBounds(10,30,80,20);lReplace.setBounds(10,70,80,20);tFind.setBound
25、s(90,30,90,20);tReplace.setBounds(90,70,90,20);bFind.setBounds(190,30,80,20);bReplace.setBounds(190,70,80,20);20add(lFind);add(tFind);add(bFind);add(lReplace);add(tReplace);add(bReplace);setResizable(false);bFind.addActionListener(this);bReplace.addActionListener(this);addWindowListener(new WindowAd
26、apter()public void windowClosing(WindowEvent e)MyFindDialog.this.dispose(););/构造函数结束public void showFind()setTitle(“查找“);setSize(280,60);setVisible(true);public void showReplace()setTitle(“查找替换“);setSize(280,110);setVisible(true);private void find() /查找方法String text=ta.getText();String str=tFind.get
27、Text();int end=text.length();int len=str.length();int start=ta.getSelectionEnd(); /获取此文本组件中选定文本的结束位置。if(start=end) start=0;for(;start=end-len;start+)if(text.substring(start,start+len).equals(str)ta.setSelectionStart(start);ta.setSelectionEnd(start+len);return;/若找不到待查字符串,则将光标置于末尾ta.setSelectionStart(
28、end);ta.setSelectionEnd(end);/*public Button getBFind() 21return bFind;*/private void replace()String str=tReplace.getText();if(ta.getSelectedText().equals(tFind.getText()/用指定替换文本替换指定开始位置与结束位置之间的文本ta.replaceRange(str,ta.getSelectionStart(),ta.getSelectionEnd();else find();public void actionPerformed
29、(ActionEvent e) if(e.getSource()=bFind)find();else if(e.getSource()=bReplace)replace();/Note类 class Note extends Frame implements ActionListenerTextArea tf=new TextArea();MenuBar mb = new MenuBar();Menu item1=new Menu(“文件“);MenuItem subitem11=new MenuItem(“新建“,new MenuShortcut(KeyEvent.VK_A, false);
30、MenuItem subitem12=new MenuItem(“打开“,new MenuShortcut(KeyEvent.VK_O, false);MenuItem subitem13=new MenuItem(“保存“,new MenuShortcut(KeyEvent.VK_S, false);MenuItem subitem14=new MenuItem(“另存为“);MenuItem subitem15=new MenuItem(“退出“);Menu item2=new Menu(“编辑“);MenuItem subitem21=new MenuItem(“查找“,new Menu
31、Shortcut(KeyEvent.VK_F, false);MenuItem subitem22=new MenuItem(“替换“,new MenuShortcut(KeyEvent.VK_H, false);MenuItem subitem23=new MenuItem(“时间日期“);Menu item3=new Menu(“作者“);MenuItem subitem31=new MenuItem(“作者信息“);MyFindDialog findDlg=new MyFindDialog(this,tf);Note()super(“记事本“);setBounds(100,100,600
32、,400);add(tf);setMenuBar(mb);mb.add(item1);22item1.add(subitem11);subitem11.addActionListener(this);item1.add(subitem12);subitem12.addActionListener(this);item1.add(“-“);item1.add(subitem13);subitem13.addActionListener(this);item1.add(subitem14);subitem14.addActionListener(this);item1.add(“-“);item1
33、.add(subitem15);subitem15.addActionListener(this);/subitem15.addActionListener(new Monitor();mb.add(item2);item2.add(subitem21);subitem21.addActionListener(this);item2.add(subitem22);subitem22.addActionListener(this);item2.add(“-“);item2.add(subitem23);subitem23.addActionListener(this);mb.add(item3)
34、;item3.add(subitem31);subitem31.addActionListener(this);setVisible(true); addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e) int option=JOptionPane.showConfirmDialog( Note.this, “确定退出程序? “, “ 提示 “,JOptionPane.YES_NO_CANCEL_OPTION); if(option=JOptionPane.YES_OPTION) if(e.ge
35、tWindow()=Note.this) System.exit(0); else return; );23public void actionPerformed(ActionEvent e)/新建if(e.getSource()=subitem11) tf.setText(“); /打开if(e.getSource()=subitem12)JFileChooser jc=new JFileChooser();jc.showOpenDialog(this);tryFile file=jc.getSelectedFile();FileInputStream fis=new FileInputSt
36、ream(file);byte buf=new byte10*1024;int len=fis.read(buf);tf.append(new String(buf,0,len);catch(Exception ex)ex.printStackTrace(); /保存if(e.getSource()=subitem13) File f2 = null;JFileChooser jfc2 = new JFileChooser();int num2 = jfc2.showSaveDialog(this); /弹出一个 “Save File“ 文件选择器对话框if(num2=JFileChooser
37、.APPROVE_OPTION) f2=jfc2.getSelectedFile(); this.setTitle(f2.getName(); tryFileWriter fw = new FileWriter(f2); BufferedWriter bw = new BufferedWriter(fw); bw.write(tf.getText(); bw.close(); fw.close(); catch(IOException e2)e2.printStackTrace(); 24/另存为if(e.getSource()=subitem14) File f2 = null;JFileC
38、hooser jfc2 = new JFileChooser();int num2 = jfc2.showSaveDialog(this);if(num2=JFileChooser.APPROVE_OPTION) f2=jfc2.getSelectedFile(); this.setTitle(f2.getName(); tryFileWriter fw = new FileWriter(f2); BufferedWriter bw = new BufferedWriter(fw); bw.write(tf.getText(); bw.close(); fw.close(); catch(IO
39、Exception e2)e2.printStackTrace(); /退出if(e.getSource()=subitem15) int a = JOptionPane.showConfirmDialog(this,“文件已被改变,是否要保存?“,“提示“,JOptionPane.YES_NO_CANCEL_OPTION); if(a=1) this.dispose(); else if(a=0) File f2 = null; JFileChooser jfc2 = new JFileChooser(); int num2 = jfc2.showSaveDialog(this); if(n
40、um2=JFileChooser.APPROVE_OPTION) f2=jfc2.getSelectedFile(); this.setTitle(f2.getName(); try FileWriter fw = new FileWriter(f2); BufferedWriter bw = new BufferedWriter(fw); bw.write(tf.getText(); bw.close(); fw.close(); 25catch(IOException e2) e2.printStackTrace(); this.dispose(); /查找if(e.getSource()
41、=subitem21)findDlg.showFind();/替换if(e.getSource()=subitem22)findDlg.showReplace();/日期if(e.getSource()=subitem23) Calendar c1 =Calendar.getInstance(); int y = c1.get(Calendar.YEAR); int m = c1.get(Calendar.MONTH); int d = c1.get(Calendar.DATE); int h = c1.get(Calendar.HOUR); int m1 = c1.get(Calendar.
42、MINUTE); int m2 = m+1; tf.setText(y+“年“+m2+“月“+d+“日“+h+“:“+m1); /作者if(e.getSource()=subitem31)tf.setText(“课程名称: java课程设计 “+n+“学院: 软件工程学院 “+n+“班级: 嵌入式系 09-01班 “+n+“姓名: 陈冲 “+n+“学号: 0920010102“); public class NoteBookpublic static void main(String args)new Note();26参考文献1刘万军.Java 6 程序设计M.第 1 版.北京:清华大学出版社,2009.2腾灵灵,仲婷. 面向对象设计原理与模式(Java 版) M.第 1 版.北京:清华大学出版社,2009.3霍顿.Java2 入门经典M. 第 2 版.北京: 机械工业出版社,2006.4李茏怡. Java 编程实例讲解M.第 2 版.北京:高等教育出版社,2005.11 27成绩评定成绩 教师签字