虚拟的Java编辑器设计报告一、需求分析此次课程设计名称为JAVA编辑器。需要设计一个图形界面的文本编辑器,能编辑Java语言源程序,界面和功能类似Editplus。演示程序为计算机和用户的对话形式执行,即在计算机的终端显示图形界面的文档编辑器,然后用户就可以实现编辑,保存等像记事本一样的功能。(1)打开以有文件,保存编辑文件,退出编辑器并提醒保存;(2)查找编辑区中的字符串,用已知字符串替换查找的字符串;(3)显示文件的存取路径;(4)剪切,复制,粘贴,删除等;(5)改变文本区字体的颜色,字体大小和形状的功能;(6)关键字显示蓝色、类库类名显示红色。二.设计1.设计思想Java编辑器是用来编写java程序的源代码。Java程序编辑器是:图形界面、线程、流与文件等技术的综合应用。图形界面的实现:就选择了swing来完成实现,在选择组件上,文本编辑区就选用了JTextPane作为主要的部件。由于Java的特性,可能用任何一个编辑器来编辑,于是就将Windows中的记事本作为模仿对象,根据实现情况删减了其中的一些功能,如自动换行,设置字体,打印等功能。在设计类的时候,考虑到简单明了,一个主类,一个默认属性myfr类,染色类SyntaxHighlighter作为程序的整体框架,所有的对象和方法都是在默认属性类和染色类中创建和实现的,以及为各组件注册事件监听程序也是在默认属性类染色类中实现的。本程序主类完成对象的实例化及显示。2.功能设计本程序涉及到了对图形用户界面的设计与实现和菜单的设计与实现。用户可以通过此编辑器对java文件进行文字的复制、剪切、粘贴、删除、查找、替换、时间的插入、设置字体颜色和关键字、类库名着色等。本程序主要有以下3个模块组成:(1)主体模块由窗口、功能菜单、文本框组成。为用户选择编辑的功能提供了简单、方便的界面。Java的窗口由JFrame类生成,我们可以在创建的空白窗口上添加组件。菜单是图形用户界面的重要组成部分,是由菜单条(MenuBar)、菜单(Menu)、菜单项(MenuItem)和复选菜单项(CheckboxMenuItem)等对象组成。(2)功能模块有文件的新建、打开、保存、另存为和退出,文字的复制、剪切、粘贴、删除、查找、替换、以及时间的插入,为用户提供了java编辑器的基础功能。(3)染色模块关键字显示蓝色,类库名显示红色。实现高亮子的核心方法StyledDocument.setCharacterAttributes(intoffset,intlength,AttributeSets,booleanreplace)3.详细设计本设计主要是模仿windows记事本界面,主要的难点是关键字染色算法和查找替换算法。其他的部分相对简单,主要就是一些容器组件的组合,布局的设置。主要的功能都在myfr类中实现的。Java中提供的多行文本编辑器有:JTextComponent,JTextArea,JTextPane,JEditorPane等,都可以使用但是因为语法着色中文本要使用多种风格的样式,所以这些文本编辑器的document要使用StyledDocument.JTextArea使用的是PlainDocument,此document不能进行多种格式的着色.JTextPane,JEditorPane使用的是StyledDocument,默认就可以使用.为了实现语法着色,可以继承自DefaultStyledDocument,设置其为这些文本编辑器的documet,或者也可以直接使用JTextPane,JEditorPane来做.为了方便,这里就直接使用JTextPane了(1)主类classok实例化初始化窗口(2)主窗口体类classmyfr字体类classMyFont(3)染色类classSyntaxHighlighter(4)鼠标右键弹出菜单类classhandlemouse(5)帮助主题类classmyhelp(6)关闭窗口XXX类classxxx(7)关闭帮助主题窗口类classxxxhelp三.调试及测试1.调试过程中遇到的主要问题及解决方法开始把染色类写在myfr中,结果出现继承错误,只好把染色类写在myfr之外,通过引用实现类与类联系。在开始设置字体颜色是出现问题,关键字可着色,不能设置字体颜色,最后发现时没有监听器的位置出现了问题!2.对设计和编码的回顾讨论和分析在本设计中没有用数据库,在直接用哈希表定义,所以只能简单定义几个常用的关键字、类库名,能说明功能实现就可以,这也是可以该进的地方。设计的功能有限,只能实现简单的文本编辑,没有编译,运行等等功能,这也是能力有限。3.测试数据集(1)主体模块定义一个myfr类对象,完成主类的实例化显示。(2)功能模块(A)文件(新建、打开、保存、另存为、退出)功能图如下:(B)编辑(复制、剪切、粘贴、删除、查找、查找下一个、替换、替换下一个、全选、日期/时间)功能图如下:(C)格式(字体、字体颜色)功能图如下:(D)格式风格(状态栏)功能图如下:(E)帮助(帮助主题、关于)功能图如下:(F)关键字显示蓝色、类库类名显示红色功能图如下:四、经验和体会。通过此次成功的实现了Java文本编辑器的设计与编写,我进一步巩固、加深了对专业课程《JAVA语言教程》的基础理论知识的理解,使我熟练的掌握了JAVA语言的输入输出流、数据库连接的使用,灵活运用各种类库。此次利用所学知识,开发小型应用系统我掌握了如何运用JAVA语言编写调试应用系统程序,并且训练了我独立开发应用系统,进行数据处理的综合能力。同时,对于给定的设计题目,如何对其进行分析,理清思路,并给出相应的数学模型,也是一项很好的考验。通过对这个课题的学习,我发现Java语言作为一种新兴的编辑语言,优势很明显,整个程序的结构很清晰,让人一目了然。而且,程序的编辑、修改、移植性也很强,可以通过对功能模块的添加,增加程序的实用性,例如查找、替换、打印等等,这些事今后可以进一步研究发展的方向。通过对这个课题的训练,使我基本掌握了Java编程的基础知识,主体模块与功能模块的结合技巧、方法,提高了我的自学能力,也锻炼了我分析问题、解决问题的能力!此次课程设计给我印象最深的就是,在程序中非常容易出小的毛病,而这些小毛病往往浪费大量的时间而不得其解,让人烦恼至极。比如,在主方法体中忘记定义一些变量,导致程序运行时程序也报出大量错,有时在鼠标随便定位处不小心按下一个字符,结果运行报错后出现意外错误,有时忘记保存等等……此后让我懂得写程序一定要仔细,要认真写清每一行代码。附录:主要源程序importjava.awt.*;importjava.awt.event.*;importjava.awt.Color;importjava.io.*;importjava.util.*;importjava.util.HashSet;importjava.util.Set;importjava.awt.datatransfer.*;importjava.awt.event.*;importjava.text.*;importjavax.swing.*;importjavax.swing.event.*;importjavax.swing.text.Caret;importjavax.swing.JFrame;importjavax.swing.JTextPane;importjavax.swing.SwingUtilities;importjavax.swing.event.DocumentEvent;importjavax.swing.event.DocumentListener;importjavax.swing.text.BadLocationException;importjavax.swing.text.Document;importjavax.swing.text.Style;importjavax.swing.text.StyleConstants;importjavax.swing.text.StyledDocument;importjavax.swing.undo.*;publicclassok{publicstaticvoidmain(String[]args){myfrfr=newmyfr(我的java编辑器);fr.setSize(600,400);}}///////////////////////////myfr主窗体类//////////////////////////////////////classmyfrextendsJFrameimplementsActionListener{Stringstr,strnext,path,fname;//部分变量的声明JPanelmainpane;JFileChooserchoose=newJFileChooser();//文件对话框Dialogfind,replace;//find为查找对话框,replace对话框JTextFieldfindtxt,repltxt;//find为查找对话框的输入文本区,replace对话框的输入文本区Fontnewfont;JButtonfindenter,replb,but;//find为查找对话框,replace对话框的确定按钮JLabelstate=newJLabel(java编辑器------未命名文档);//状态栏JTextPanetxt1;//主输入文本区Filenewfiles;JPopupMenupopm;//弹出菜单声明JMenum1,m2,m3,m4,m5,m6;//各菜单项JMenuItemm61,m62,m26,m271,m34,m51,m52,m53,m54,p_copy,p_cut,p_paste,p_del,font;intstartp,endp,nexttemp,newstartp,newendp;//查找替换时所用的临时变量JToolBartoolbar=newJToolBar();//工具条privateSetStringkeywords;privateSetStringclasswords;privateStylekeywordStyle;privateStyleclasswordStyle;privateStylenormalStyle;myfr(Stringsss)/////构造函数开始{super(sss);JMenuBarmb=newJMenuBar();fname=null;//初始文件名为空findenter=newJButton(确定);findenter.addActionListener(this);//声明对话框中上确定按钮,并注册事件replb=newJButton(确定);replb.addActionListener(this);mainpane=(JPanel)this.getContentPane();mainpane.setLayout(newBorderLayout());txt1=newJTextPane();txt1.getDocument().addDocumentListener(newSyntaxHighlighter(txt1));txt1.addMouseListener(newhandlemouse(this));//注册鼠标右击事件txt1.setFont(newFont(宋体,Font.PLAIN,18));mainpane.add(txt1,BorderLayout.CENTER);mainpane.add(North,toolbar);mainpane.add(South,state);JScrollPanesll=newJScrollPane();//创建滚动条mainpane.add(Center,sll);;sll.getViewport().add(txt1);//将滚动条装入文本区popm=newJPopu