资源描述
虚拟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)和复选菜单项(Checkbox MenuItem)等对象构成。
(2)功能模块
有文献新建、打开、保存、另存为和退出,文字复制、剪切、粘贴、删除、查找、替代、以及时间插入,为顾客提供了java编辑器基本功能。
(3)染色模块
核心字显示蓝色,类库名显示红色。实现高亮子核心办法
StyledDocument.setCharacterAttributes(int offset,int length,AttributeSet s,boolean replace)
3. 详细设计
本设计重要是模仿windows记事本界面,重要难点是核心字染色算法和查找替代算法。其她某些相对简朴,重要就是某些容器组件组合,布局设立。重要功能都在myfr类中实现。
Java中提供多行文本编辑器有:JTextComponent,JTextArea,JTextPane,JEditorPane等,都可以使用但是由于语法着色中文本要使用各种风格样式,因此这些文本编辑器document要使用StyledDocument. JTextArea使用是PlainDocument,此document不能进行各种格式着色.JTextPane,JEditorPane使用是StyledDocument,默认就可以使用.
为了实现语法着色,可以继承自DefaultStyledDocument,设立其为这些文本编辑器documet,或者也可以直接使用JTextPane,JEditorPane来做. 为了以便,这里就直接使用JTextPane了
(1)主类 class ok
实例化初始化窗口
(2)主窗口体类 class myfr 字体类 class MyFont
(3)染色类class SyntaxHighlighter
(4)鼠标右键弹出菜单类class handlemouse
(5)协助主题类class myhelp
(6)关闭窗口XXX类class xxx
(7)关闭协助主题窗口类class xxxhelp
三. 调试及测试
1. 调试过程中遇到重要问题及解决办法
开始把染色类写在myfr中,成果浮现继承错误,只得把染色类写在myfr之外,通过引用实现类与类联系。在开始设立字体颜色是浮现问题,核心字可着色,不能设立字体颜色,最后发现时没有监听器位置浮现了问题!
2. 对设计和编码回顾讨论和分析
在本设计中没有用数据库,在直接用哈希表定义,因此只能简朴定义几种惯用核心字、类库名,能阐明功能实现就可以,这也是可以该进地方。设计功能有限,只能实现简朴文本编辑,没有编译,运营等等功能,这也是能力有限。
3.测试数据集
(1)主体模块
定义一种myfr类对象,完毕主类实例化显示。
(2)功能模块
(A)文献(新建、打开、保存、另存为、退出)
功能图如下:
(B)编辑(复制、剪切、粘贴、删除、查找、查找下一种、替代、替代下一种、全选、日期/时间)
功能图如下:
(C)格式(字体、字体颜色)
功能图如下:
(D)格式风格(状态栏)
功能图如下:
(E)协助(协助主题、关于)
功能图如下:
(F)核心字显示蓝色、类库类名显示红色
功能图如下:
四、经验和体会。
通过本次成功实现了Java文本编辑器设计与编写,我进一步巩固、加深了对专业课程《JAVA语言教程》基本理论知识理解,使我纯熟掌握了JAVA语言输入输出流、数据库连接使用,灵活运用各种类库。本次运用所学知识,开发小型应用系统我掌握了如何运用JAVA语言编写调试应用系统程序,并且训练了我独立开发应用系统,进行数据解决综合能力。同步,对于给定设计题目,如何对其进行分析,理清思路,并给出相应数学模型,也是一项较好考验。
通过对这个课题学习,我发现Java语言作为一种新兴编辑语言,优势很明显,整个程序构造很清晰,让人一目了然。并且,程序编辑、修改、移植性也很强,可以通过对功能模块添加,增长程序实用性,例如查找、替代、打印等等,这些事此后可以进一步研究发展方向。
通过对这个课题训练,使我基本掌握了Java编程基本知识,主体模块与功能模块结合技巧、办法,提高了我自学能力,也锻炼了我分析问题、解决问题能力!
本次课程设计给我印象最深就是,在程序中非常容易出小毛病,而这些小毛病往往挥霍大量时间而不得其解,让人烦恼至极。例如,在主办法体中忘掉定义某些变量,导致程序运营时程序也报出大量错,有时在鼠标随便定位处不小心按下一种字符,成果运营报错后浮现意外错误,有时忘掉保存等等……此后让我懂得写程序一定要仔细,要认真写清每一行代码。
附录:重要源程序
import java.awt.*;
import java.awt.event.*;
import java.awt.Color;
import java.io.*;
import java.util.*;
import java.util.HashSet;
import java.util.Set;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.text.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.Caret;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.undo.*;
public class ok{
public static void main(String[] args)
{
myfr fr=new myfr ("我java编辑器");
fr.setSize(600,400);
}
}
///////////////////////////myfr主窗体类//////////////////////////////////////
class myfr extends JFrame implements ActionListener
{
String str,strnext,path,fname;//某些变量声明
JPanel mainpane;
JFileChooser choose = new JFileChooser();//文献对话框
Dialog find,replace;//find为查找对话框,replace对话框
JTextField findtxt,repltxt;//find为查找对话框输入文本区,replace对话框输入文本区
Font newfont;
JButton findenter,replb,but;//find为查找对话框,replace对话框拟定按钮
JLabel state=new JLabel("java编辑器------未命名文档");//状态栏
JTextPane txt1;//主输入文本区
File newfiles;
JPopupMenu popm;//弹出菜单声明
JMenu m1,m2,m3,m4,m5,m6;//各菜单项
JMenuItem m61,m62,m26,m271,m34,m51,m52,m53,m54,p_copy,p_cut,p_paste,p_del,font;
int startp,endp,nexttemp,newstartp,newendp;//查找替代时所用暂时变量
JToolBar toolbar = new JToolBar();//工具条
private Set<String> keywords;
private Set<String> classwords;
private Style keywordStyle;
private Style classwordStyle;
private Style normalStyle;
myfr(String sss) /////构造函数开始
{
super(sss);
JMenuBar mb=new JMenuBar();
fname=null;//初始文献名为空
findenter=new JButton("拟定");
findenter.addActionListener(this);//声明对话框中上拟定按钮,并注册事件
replb=new JButton("拟定");
replb.addActionListener(this);
mainpane=(JPanel)this.getContentPane();
mainpane.setLayout(new BorderLayout());
txt1=new JTextPane();
txt1.getDocument().addDocumentListener(new SyntaxHighlighter(txt1));
txt1.addMouseListener(new handlemouse(this));//注册鼠标右击事件
txt1.setFont(new Font("宋体",Font.PLAIN,18));
mainpane.add(txt1,BorderLayout.CENTER);
mainpane.add("North",toolbar);
mainpane.add("South",state);
JScrollPane sll = new JScrollPane();//创立滚动条
mainpane.add("Center",sll);;
sll.getViewport().add(txt1);//将滚动条装入文本区
popm=new JPopupMenu();////POPMeun 开始
p_copy=new JMenuItem("复制 ");
p_copy.addActionListener(this);
KeyStroke keycopyp=KeyStroke.getKeyStroke(KeyEvent.VK_C,Event.CTRL_MASK);
p_copy.setAccelerator(keycopyp);
p_cut=new JMenuItem("剪切 ");
p_cut.addActionListener(this);
KeyStroke keycutp=KeyStroke.getKeyStroke(KeyEvent.VK_X,Event.CTRL_MASK);
p_cut.setAccelerator(keycutp);
p_paste=new JMenuItem("粘贴 ");
p_paste.addActionListener(this);
KeyStroke keypp=KeyStroke.getKeyStroke(KeyEvent.VK_V,Event.CTRL_MASK);
p_paste.setAccelerator(keypp);
p_del=new JMenuItem("删除 ");
p_del.addActionListener(this);
KeyStroke keydelp=KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0);
p_del.setAccelerator(keydelp);
popm.add(p_copy);
popm.add(p_cut);
popm.add(p_paste);
popm.add(p_del);
txt1.add(popm);////POPMenu 结束
m1=new JMenu("文献(F)");
m1.setMnemonic('F');//定义快捷方式
JMenuItem m10=new JMenuItem("新建 ");
m10.addActionListener(this);//注册事件监听器
KeyStroke keynew=KeyStroke.getKeyStroke(KeyEvent.VK_N,Event.CTRL_MASK);//定义快捷键
m10.setAccelerator(keynew);
JMenuItem m11=new JMenuItem("打开 ");
m11.addActionListener(this);
KeyStroke keyopen=KeyStroke.getKeyStroke(KeyEvent.VK_O,Event.CTRL_MASK);
m11.setAccelerator(keyopen);
JMenuItem m12=new JMenuItem("保存 ");
m12.addActionListener(this);
KeyStroke keysave=KeyStroke.getKeyStroke(KeyEvent.VK_S,Event.CTRL_MASK);
m12.setAccelerator(keysave);
JMenuItem m13=new JMenuItem("另保存为 ");
m13.addActionListener(this);
JMenuItem m14=new JMenuItem("退出 ");
m14.addActionListener(this);
KeyStroke keyexit=KeyStroke.getKeyStroke(KeyEvent.VK_F4,Event.ALT_MASK);
m14.setAccelerator(keyexit);
////////////////////////////////////////////
m2=new JMenu("编辑(E)");
m2.setMnemonic('E');
JMenuItem m21=new JMenuItem("复制 ");
m21.addActionListener(this);
KeyStroke keycopy=KeyStroke.getKeyStroke(KeyEvent.VK_C,Event.CTRL_MASK);
m21.setAccelerator(keycopy);
JMenuItem m22=new JMenuItem("剪切 ");
m22.addActionListener(this);
KeyStroke keycut=KeyStroke.getKeyStroke(KeyEvent.VK_X,Event.CTRL_MASK);
m22.setAccelerator(keycut);
JMenuItem m23=new JMenuItem("粘贴 ");
m23.addActionListener(this);
KeyStroke keyp=KeyStroke.getKeyStroke(KeyEvent.VK_V,Event.CTRL_MASK);
m23.setAccelerator(keyp);
JMenuItem m24=new JMenuItem("删除 ");
m24.addActionListener(this);
KeyStroke keydel=KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0);
m24.setAccelerator(keydel);
JMenuItem m25=new JMenuItem("查找 ");
m25.addActionListener(this);
KeyStroke keyfind=KeyStroke.getKeyStroke(KeyEvent.VK_F,Event.CTRL_MASK);
m25.setAccelerator(keyfind);
m26=new JMenuItem("查找下一种 ");
m26.addActionListener(this);
KeyStroke keyfn=KeyStroke.getKeyStroke(KeyEvent.VK_F3,0);
m26.setAccelerator(keyfn);
m26.setEnabled(false);
JMenuItem m27=new JMenuItem("替代 ");
m27.addActionListener(this);
KeyStroke keyrepl=KeyStroke.getKeyStroke(KeyEvent.VK_H,Event.CTRL_MASK);
m27.setAccelerator(keyrepl);
m271=new JMenuItem("替代下一种");
m271.setEnabled(false);
m271.addActionListener(this);
KeyStroke keyrepn=KeyStroke.getKeyStroke(KeyEvent.VK_F6,0);
m271.setAccelerator(keyrepn);
JMenuItem m28=new JMenuItem("全选 ");
m28.addActionListener(this);
KeyStroke keyall=KeyStroke.getKeyStroke(KeyEvent.VK_A,Event.CTRL_MASK);
m28.setAccelerator(keyall);
JMenuItem m29=new JMenuItem("日期/时间 ");
m29.addActionListener(this);
///////////////////////////////////////////
m3=new JMenu("格式(O)");
m3.setMnemonic('O');
font=new JMenuItem("字体[F]");
font.addActionListener(this);
JMenuItem m33=new JMenuItem("字体颜色 ");
m33.addActionListener(this);
//////////////////////////////////////////
m5=new JMenu("视图风格(V)");
m5.setMnemonic('V');
m54=new JMenuItem("状态栏 ");
m54.addActionListener(this);
//////////////////////////////////////////
m6=new JMenu("协助(H)");
m6.setMnemonic('H');
m61=new JMenuItem("协助主题 ");
m61.addActionListener(this);
m62=new JMenuItem("关于 ");
m62.addActionListener(this);
//添加各项
m1.add(m10);m1.add(m11);m1.add(m12);m1.add(m13);m1.addSeparator();m1.add(m14);m3.add(font);
m2.add(m21);m2.add(m22);m2.add(m23);m2.add(m24);m2.addSeparator();m2.add(m25);
m2.add(m26);m2.add(m27);m2.add(m271);m2.addSeparator();m2.add(m28);
m2.add(m29);m3.add(m33);m5.add(m54);m6.add(m61);
m6.addSeparator();m6.add(m62);mb.add(m1);mb.add(m2);mb.add(m3);
mb.add(m5);mb.add(m6);this.setJMenuBar(mb);//设立菜单栏
setVisible(true);
pack();
show();
this.addWindowListener(new xxx(this));
}///构造函数结束///
////////////////事件解决/////////////////////////////////////
public void actionPerformed(ActionEvent p)
{
if(p.getActionCommand()=="新建 ") //响应菜单及工具栏事件
{
fname=null;//置文献名为空,便于判断文献与否保存过
txt1.setText("");
state.setText(" 我java编辑器------未命名文档");
}
if(p.getActionCommand()=="打开 ")
{
try {
if(this.choose.APPROVE_OPTION==this.choose.showOpenDialog(this))
{
path=this.choose.getSelectedFile().getPath();
fname=this.choose.getSelectedFile().getName();
File file=new File(path);
int flength=(int)file.length();
FileReader fReader=new FileReader(file);
char[] data=new char[flength];
fReader.read(data,0,flength);
txt1.setText(new String(data));
state.setText(" 我java编辑器------"+path+" 共"+flength+"字节");//状态栏记录文献字节数
txt1.setCaretPosition(0);
}}
catch(IOException e)
{}
}
if(p.getActionCommand()=="保存 ")
{
if(fname==null) //如果文献名为空,阐明文献未被创立,弹出另存为对话框
{ othersave();}
try {
File savefile=new File(path);
savefile.createNewFile();
FileWriter fw=new FileWriter(savefile);
fw.write(txt1.getText());
fw.close();
}
catch(IOException e)
{}
}
if(p.getActionCommand()=="另保存为 ")
{othersave();}
if(p.getActionCommand()=="退出 ")
{exit();}
//////////////////编辑////////////////////
if(p.getActionCommand()=="复制 ")
{ txt1.copy();}
if(p.getActionCommand()=="剪切 ")
{ txt1.cut();}
if(p.getActionCommand()=="粘贴 ")
{ txt1.paste();}
if(p.getActionCommand()=="删除 ")
{
txt1.replaceSelection("");
}
///////////////////////////////////////////////////////
if(p.getActionCommand()=="查找 ") // 创立查找对话框;
{find=new Dialog(this,"查找");
JPanel p1=new JPanel();
JPanel p2=new JPanel();
findtxt=new JTextField(7);
p1.add(new JLabel("输入要查找字符:"));
p1.add(findtxt);
p2.add(findenter);
find.add("Center",p1);
find.add("South",p2);
find.setSize(200,200);
find.show();
}
if(p.getSource()==findenter) ///点击查找对话框拟定按钮后事件解决
{
if(findtxt.getText().equals(""))
{find.dispose();}
else if(!findtxt.getText().equals(""))
{ find.dispose();
str=txt1.getText();
startp=str.indexOf(findtxt.getText());
endp=startp+findtxt.getText().length();
txt1.select(startp,endp);
m26.setEnabled(true);
newendp=endp;////////获取这次查找终点
notfindmethod();
}
}
//////////////////////////////////////////////////////////
if(p.getActionCommand()=="查找下一种 ")
{
nexttemp=newendp;/////获取上次查找终点做为未查找字符串起点
String strall=txt1.getText();
txt1.select(nexttemp,strall.length());/////选中所有未查找字符串
strnext=txt1.getSelectedText();
newstartp=strnext.indexOf(findtxt.getText())+nexttemp;/////在未查找字符串里搜索相应字符在TXT1中位置
newendp=newstartp+findtxt.getText().length();
txt1.select(newstartp,newendp);////找到相应文本,并选取
notfindmethod();
}
/////////////////////////////////////////////////////////
if(p.getActionCommand()=="替代 ")
{m271.setEnabled(true);
replace=new Dialog(this,"替代");// 创立替代对话框;
JPanel p1=new JPanel();
JPanel p2=new JPanel();
JPanel p3=new JPanel();
findtxt=new JTextField(7);
repltxt=new JTextField(7);
p1.add(new JLabel("输入原始字符:"));
p1.add(findtxt);
p2.add(new JLabel("输入替代字符:"));
p2.add(repltxt);
p3.add(replb);
replace.add("North",p1);
replace.add("Center",p2);
replace.add("South",p3);
replace.setSize(200,150);
replace.show();
}
if(p.getSource()==replb) ///点击替代对话框拟定按钮后事件解决
{
replace.dispose();
str=txt1.getText();
startp=str.indexOf(findtxt.getText());
endp=startp+findtxt.getText().length();
txt1.select(startp,endp);
txt1.replaceSelection(repltxt.getText());
/*txt1.replaceRange(repltxt.getText(),startp,endp);*/
newendp=endp;///获取这次替代终点
}
//////////////////////////////////////////////////
if(p.getActionCommand()=="替代下一种")
{nexttemp=newendp;/////获取上次查找终点做为未查找字符串起点
String strall=txt1.getText();
txt1.select(nexttemp,strall.length());/////选中所有未查找字符串
strnext=txt1.getSelectedText();
newstartp=strnext.indexOf(findtxt.getText())+nexttemp;/////在未查找字符串里搜索相应字符在TXT1中位置
newendp=newstartp+findtxt.getText().length();
txt1.select(newstartp,newendp);
notfindmethod();
txt1.replaceSelection(repltxt.getText());
/*txt1.replaceRange(repltxt.getText(),newstartp,newendp);//替代字符*/
}
if(p.getActionCommand()=="全选 ")
{txt1.selectAll();}
if(p.getActionCommand()=="日期/时间 ") //用DATE类插入当前日期/时间,编译时会浮现阐明
{txt1.setText(txt1.getText()+Calendar.getInstance().getTime().toString());}
//格式//
if(p.getSource()==font)//字体
{
new MyFont();
}
if(p.getActionCommand()=="字体颜色 ") //字体颜色
{
JColorChooser jColor=new JColorChooser();//调用颜色面板,设立前景就可更改字体颜色
Color fcolor=txt1.getForeground();
txt1.setForeground( jColor.showDialog(txt1,"选取字体颜色",fcolor));
normalStyle = ((StyledDocument) txt1.getDocument()).addStyle("Keyword_Style",null);
StyleConstants.setForeground(normalStyle,fcolor);
}
//试图风格//
if(p.getActionCommand()=="状态栏 ") //状态栏隐藏和显视
{state.setVisible( !(state.isVisible()) );}
/////////////////////协助///////////////////////////////////////////
if(p.getActionCommand()=="协助主题 ")
{myhelp help=new myhelp();
help.setSize(200,240);}
if(p.getActionCommand()=="关于 ")
{
JLabel prompt=new JLabel("欢迎使用我JAVA编辑器",JLabel.CENTER);
JOptionPane.showMessageDialog(null,prompt,"关于我JAVA编辑器",JOptionPane.INFORMATION_MESS
展开阅读全文