




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
南京邮电大学计算机学院 20102011学年第2学期 JAVA语言课程大作业报告 课题代号(单选)课题1 课题2 课题3 课题名称: 通用源代码编辑器 小组成员人数(单选)1人 2人 3人 4人 小组成员名单(学号和姓名):(1)学号 B0904 姓名 (2)学号_ _ 姓名 (3)学号 姓名 课题实现采用的工具(如为其他,请填写具体工具名称)NetBeans Eclipse JDK命令行 其他_课题实现采用的操作系统(如为其他,请填写操作系统名称)MicroSoft Windows Unix Linux 其他_课题完成时间:_2011.6.21_ 对应提交的电子文档打包文件名称(准确填写):_B09040119_B09040121_B09040220.zip =以下部分为教师填写区,请勿填写=评阅编号:( )( )成绩评定:软件运行_软件基本功能_软件提高功能_ 软件部分成绩_文档结构_文档理论_文档撰写_ 文档部分成绩_ 总成绩_备注_一、 需求分析课题要求:基本要求:设计用于软件开发时编写源代码的编辑器,可以完成文本方式的源程序的文件打开,编辑和文件保存操作。提高要求:实现对包括Java语言在内的编程语言集合(如Java, C,C+,ASM等)的关键词语法加亮功能;实现剪贴板的功能;实现搜索定位关键字段的功能;实现搜索替换关键字段的功能;实现二进制文件的打开以及编辑功能(一般用16进制方式进行)。由课题要求知,演示程序为计算机和用户的对话形式执行,即在计算机的终端显示图形界面的源代码编辑器,然后用户可以实现编辑,保存,关键字加亮等功能。二、概要设计程序主要是使用Java的图形界面编程方法设计出一个界面出来。设计出的界面应该包括一个菜单栏,菜单栏中包含各个菜单项目实现对文档的设置、打开和保存功能。对于字符串的查找和替换功能的实现可以在程序中设计出一个对话框,由用户输入需要查找和替换的内容,程序根据用户输入的内容来实现程序要求的功能。在界面中应该有一个用于输入文本的组件,在Java图形用户界面编程中可以选择用JTextArea,可以完成文本方式的源程序的文件打开,编辑和文件保存操作。但要求实现对包括Java语言在内的编程语言集合(如Java, C,C+,ASM等)的关键词语法加亮功能,使用它却不能实现这样的功能,所以在程序中选用了JTextPane,它可以对输入的字符实现不同颜色和字体式样。三、 详细设计设计一个CodeEditor类,继承自JFrame类,并在CodeEditor类利用JtextPane创建面板窗口textPane,利用Jlabel创建状态栏 statusBar,利用JFileChooser 创建文件选择器filechooser,利用JMenuBar创建并实例化菜单栏,利用JToolBar创建工具栏,再通过一些具体方法实现各功能键的功能。建立构造函数public CodeEditor ();通过该构造函数实现记事本程序的主要功能,运行时在主类中通过调用该构造函数来实现对记事本程序的基本操作。1. 窗口设计在主接口中设计一个CodeEditor容器继承自JFrame,并在其中加入菜单栏、工具栏和一个文本域控件。 public class CodeEditor extends JFrameJTextPane textPane = new JTextPane(); /创建文本窗格,编辑窗口JFileChooser filechooser = new JFileChooser(); /文件选择器setJMenuBar(createJMenuBar(actions); /设置菜单栏Container container = getContentPane(); /得到容器 container.add(createJToolBar(actions), BorderLayout.NORTH);/工具栏container.add(textPane, BorderLayout.CENTER); /增加文本窗格container.add(statusBar, BorderLayout.SOUTH); /增加状态栏2. 功能设计(1)在下拉菜单中加入子菜单并进行监听,分别实现对文件的操作功能。点击不同菜单项时,显示不同接口。(2)加入工具栏的功能键,通过工具栏实现对文本的基本操作。(3)对每个菜单项进行注册监听。点击不同功能键时,实现不同的操作,显示不同的窗口。各种具体功能实现的相关代码:(1) 文件打开:class OpenAction extends AbstractAction /打开文件命令 public OpenAction() super(打开); public void actionPerformed(ActionEvent e) int i = filechooser.showOpenDialog(CodeEditor.this); /显示打开文件对话框 if (i = JFileChooser.APPROVE_OPTION) /点击对话框中打开选项 File f = filechooser.getSelectedFile(); /得到选择的文件 try InputStream is = new FileInputStream(f); /得到文件输入流is filePath = f.getAbsolutePath(); textPane.setDocument(new DefaultStyledDocument(); /清空文档 textPane.getDocument().addDocumentListener(new SyntaxHighlighter(textPane); JTextPane t = new JTextPane() ; /读入文件到文本窗格 t.read(is, d); textPane.setText(t.getText(); catch (Exception ex) ex.printStackTrace(); /输出出错信息 (2) 新建:class NewAction extends AbstractAction /新建文件命令 public NewAction() super(新建); public void actionPerformed(ActionEvent e) textPane.setDocument(new DefaultStyledDocument(); /清空文档 textPane.getDocument().addDocumentListener(new SyntaxHighlighter(textPane);/getDocument():获取与编辑器关联的模型 ; addDocumentListener注册给定的观察者以便开始接收文档发生更改的通知 (3) 保存:class SaveAction extends AbstractAction /保存命令 public SaveAction() super(保存); public void actionPerformed(ActionEvent e) int i = filechooser.showSaveDialog(CodeEditor.this); /显示保存文件对话框 if (i = JFileChooser.APPROVE_OPTION) /点击对话框中保存按钮 File f = filechooser.getSelectedFile(); /得到选择的文件 try FileOutputStream out = new FileOutputStream(f); /得到文件输出流 textPane.getDocument().addDocumentListener(new SyntaxHighlighter(textPane);/getDocument():获取与编辑器关联的模型 ; addDocumentListener注册给定的观察者以便开始接收文档发生更改的通知 out.write(textPane.getText().getBytes(); /写出文件 catch (Exception ex) ex.printStackTrace(); /输出出错信息 (4) 查找:class SearchAction extends AbstractAction /查找命令 public SearchAction() super(查找); class Search extends JFrame implements ActionListener private static final long serialVersionUID = 1L;JButton jb1 = null; JTextField jt1 = null; public Search() jt1 = new JTextField(10);this.setLayout(new GridLayout(3,1); JPanel jp1 = new JPanel(); JLabel jl1 = new JLabel(查找内容); jp1.add(jl1); jp1.add(jt1); this.add(jp1); JPanel jp3 = new JPanel(); jb1 = new JButton(查找); jb1.addActionListener(this); JButton jb4 = new JButton(取消); jb4.addActionListener(this); jp3.add(jb1); jp3.add(jb4); this.add(jp3); this.setSize(350,250); this.setLocation(400,400);/设置窗口位置 this.setVisible(true);/尽可能放后 this.setResizable(false);/窗口大小固定 public void actionPerformed(ActionEvent e) JButton jSearch = (JButton)(e.getSource();if(jSearch = jb1) String find; String currentTextInTextArea; int findLength; int findIndex; find=jt1.getText(); if(find=null) JOptionPane.showMessageDialog(null,查找失败!); else findLength=find.length(); currentTextInTextArea=textPane.getText(); findIndex=currentTextInTextArea.indexOf(find); if(findIndex0) JOptionPane.showMessageDialog(null,查找的内容不存在!); else System.out.println(+findIndex); textPane.requestFocus(); textPane.select(findIndex,findIndex+findLength); else this.dispose(); public void actionPerformed(ActionEvent e) new Search(); (5) 替换:class ExchangeAction extends AbstractAction /替换命令 public ExchangeAction() super(替换); class Replace extends JFrame implements ActionListener JTextField jt1 = null; JTextField jt2 = null; int next = 0; int start = 0; public Replace() jt1 = new JTextField(10); jt2 = new JTextField(10); next = 0;/从什么位置找 start = 0;/找到的第一个字符的位置 this.setLayout(new GridLayout(3,1); JPanel jp1 = new JPanel(); JLabel jl1 = new JLabel(查找内容); jp1.add(jl1); jp1.add(jt1); this.add(jp1);JPanel jp2 = new JPanel();JLabel jl2 = new JLabel(替换为); jp2.add(jl2);jp2.add(jt2);this.add(jp2); JPanel jp3 = new JPanel();JButton jb1 = new JButton(查找下一个); jb1.addActionListener(this);JButton jb3 = new JButton(替换);jb3.addActionListener(this);JButton jb4 = new JButton(取消);jb4.addActionListener(this);jp3.add(jb1);jp3.add(jb3);jp3.add(jb4);this.add(jp3); this.setSize(350,250);this.setLocation(400,400);/设置窗口位置this.setVisible(true);/尽可能放后this.setResizable(false);/窗口大小固定 public void actionPerformed(ActionEvent e) /如何实现替换功能 String comm = e.getActionCommand(); String text = textPane.getText();/获得文本框内容 String jtt1 = jt1.getText();/获得查找内容 String jtt2 = jt2.getText();/获得替换内容 int length = jtt1.length();/获得查找内容长度 if(查找下一个.equals(comm) if(jtt1.equals() JOptionPane.showMessageDialog(null, 请输入内容!, , JOptionPane.ERROR_MESSAGE); else if(text.indexOf(jtt1,next)!=-1)/返回指定字符在此字符串中第一次出现处的索引 start = text.indexOf(jtt1,next); textPane.setSelectionStart(start); textPane.setSelectionEnd(start+length); next = start+length; else JOptionPane.showMessageDialog(null, sorry!we cannt find it!, , JOptionPane.ERROR_MESSAGE); else if(替换.equals(comm) int n = 0; next = 0; while(next textPane.getText().length() if(textPane.getText().indexOf(jtt1,next)!= -1) /返回指定字符在此字符串中第一次出现处的索引 start = textPane.getText().indexOf(jtt1,next); textPane.setSelectionStart(start); textPane.setSelectionEnd(start+length); textPane.replaceSelection(jtt2);/, start,start+length); n = 1; next = start + jtt2.length() - 1; else if(n = 0) JOptionPane.showMessageDialog (null, very sorry!we cannt find it!, , JOptionPane.ERROR_MESSAGE); break; else if(取消.equals(comm) this.dispose(); public void actionPerformed(ActionEvent e) new Replace(); (6)退出class ExitAction extends AbstractAction /退出命令 public ExitAction() super(退出); public void actionPerformed(ActionEvent e) System.exit(0); /退出程序 (7)剪切class CutAction extends AbstractAction /剪切命令 public CutAction() super(剪切); public void actionPerformed(ActionEvent e) textPane.cut(); /调用文本窗格的剪切命令 (8)拷贝class CopyAction extends AbstractAction /拷贝命令 public CopyAction() super(拷贝); public void actionPerformed(ActionEvent e) textPane.copy(); /调用文本窗格的拷贝命令 (9)粘贴class PasteAction extends AbstractAction /粘贴命令 public PasteAction() super(粘贴); public void actionPerformed(ActionEvent e) textPane.paste(); /调用文本窗格的粘贴命令 (10)关于class AboutAction extends AbstractAction /关于选项命令 public AboutAction() super(关于); public void actionPerformed(ActionEvent e) JOptionPane.showMessageDialog(CodeEditor.this, 南邮计院计科B090401n+ /1657556702_ ); /显示软件信息 (11)关键字加亮功能class SyntaxHighlighter implements DocumentListener private Set keywords;/接口 Set; E - 此 set 所维护元素的类型private Style keywordStyle;/Style:与文档中某个元素相关的属性集合 private Style normalStyle; public SyntaxHighlighter(JTextPane editor) / 准备着色使用的样式keywordStyle = (StyledDocument) editor.getDocument().addStyle(Keyword_Style, null);normalStyle = (StyledDocument) editor.getDocument().addStyle(Keyword_Style, null); StyleConstants.setForeground(keywordStyle, Color.RED); StyleConstants.setBold(keywordStyle, true); StyleConstants.setForeground(normalStyle, Color.BLACK); StyleConstants.setBold(normalStyle, true); / 准备关键字 keywords = new HashSet(); keywords.add(public); keywords.add(protected); keywords.add(private); keywords.add(int); keywords.add(char); keywords.add(float); keywords.add(double); keywords.add(class); keywords.add(new); keywords.add(implements); keywords.add(static); keywords.add(void); keywords.add(import); keywords.add(package); keywords.add(while); keywords.add(if); keywords.add(else); keywords.add(return); keywords.add(boolean); keywords.add(true); keywords.add(false); keywords.add(try); keywords.add(catch); keywords.add(this); public void colouring(StyledDocument doc, int pos, int len) throws BadLocationException / 取得插入或者删除后影响到的单词. / 例如public在b后插入一个空格, 就变成了:pub lic, 这时就有两个单词要处理:pub和lic / 这时要取得的范围是pub中p前面的位置和lic中c后面的位置 int start = indexOfWordStart(doc, pos); int end = indexOfWordEnd(doc, pos + len); char ch; while (start end) ch = getCharAt(doc, start); if (Character.isLetter(ch) | ch = _) /确定指定字符是否为字母 / 如果是以字母或者下划线开头, 说明是单词 / pos为处理后的最后一个下标 start = colouringWord(doc, start); else SwingUtilities.invokeLater(new ColouringTask(doc, start, 1, normalStyle); +start; public int colouringWord(StyledDocument doc, int pos) throws BadLocationException int wordEnd = indexOfWordEnd(doc, pos); String word = doc.getText(pos, wordEnd - pos); if (keywords.contains(word) / 如果是关键字, 就进行关键字的着色, 否则使用普通的着色. / 这里有一点要注意, 在insertUpdate和removeUpdate的方法调/用的过程中, 不能修改doc的属性. / 但我们又要达到能够修改doc的属性, 所以把此任务放到这个方/法的外面去执行. / 实现这一目的, 可以使用新线程, 但放到swing的事件队列里去/处理更轻便一点. SwingUtilities.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, keywordStyle); else SwingUtilities.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, normalStyle); return wordEnd; /* * 取得在文档中下标在pos处的字符. * * 如果pos为doc.getLength(), 返回的是一个文档的结束符, 不会抛出异常. 如果pos 0 & isWordCharacter(doc, pos - 1); -pos); return pos; /* * 取得下标为pos时, 它所在的单词结束的下标. word (表示pos, 表示开始或结束的下标) */ public int indexOfWordEnd(Document doc, int pos) throws BadLocationException / 从pos开始向前找到第一个非单词字符. for (; isWordCharacter(doc, pos); +pos); return pos; public boolean isWordCharacter(Document doc, int pos) throws BadLocationException char ch = getCharAt(doc, pos); if (Character.isLetter(ch) | Character.isDigit(ch) | ch = _) return true; / isDigit(ch):确定指定字符是否为数字 return false; public void changedUpdate(DocumentEvent e) public void insertUpdate(DocumentEvent e) try colouring(StyledDocument) e.getDocument(), e.getOffset(), e.getLength(); catch (BadLocationException e1) e1.printStackTrace(); public void removeUpdate(DocumentEvent e) try / 因为删除后光标紧接着影响的单词两边, 所以长度就不需要了 colouring(StyledDocument) e.getDocument(), e.getOffset(), 0); catch (BadLocationException e1) e1.printStackTrace(); private class ColouringTask implements Runnable private StyledDocument doc;/用作通用样式化文档的接口 private Style style;/Style:与文档中某个元素相关的属性集合 private int pos; private int len; public ColouringTask(StyledDocument doc, int pos, int len, Style style) /构造函数 this.doc = doc; this.pos = pos; this.len = len; this.style = style; public void run() /使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。方法 run 的常规协定是,它可能执行任何所需的动作。 try / 这里就是对字符进行着色doc.setCharacterAttributes(pos, len, style, true);/更改内容元素属性,该属性是用来给定文档中现有内容范围的 catch (Exception e) 五、 软件调试与测试1.运行后,弹出窗体如下图所示2.当点击打开按钮后,如下图3. 编辑完一段代码后,以下图程序为例,以TestFrame.java为文件名保存,结果如下图所示。4. 关键字加亮功能如图所示打开TestPoint.java文件,可以看到Java语言中的关键字package,public,class,static等都显示为颜色红色,字体加粗,不仅Java语言中的相关关键字出现加亮,C/C+中如include,template,using,namespace等关键字也实现加亮。5.查找功能:输入代码“public static void main”,点击查找按钮,会弹出一个小窗口,在对应标签为“查找内容”的文本框中输入“void”,按下面的“查找”按钮,即可看到代码编辑器中的void被选中,即说明查找成功。另外当出现多个相同的代码时,可利用菜单栏里“替换”按钮中的“查找下一个”实现。在这地方不予重复。6.替换:同样输入代码“public static void main”,按“替换”,弹出一个小窗口,在查找内容中输入“void”,“替换为”中输入“int”, 然后得到“public staticInt main”,如下图所示。7.复制和粘贴功能同样输入代码“public static void main”, 选中“main”,点击“拷贝”,然后把光标放在“main”后面,再点击“拷贝”,得到结果如下图所示。 8.剪切和粘贴输入“
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 伤口冲洗查房课件
- 郑州市农村管理办法
- 路灯照明巡查管理办法
- 高校交流生管理办法
- 护理团队高效协作与沟通技巧实战指南
- 企业生产安全培训知识课件
- 2025年疼痛科疼痛评估和管理规范考试答案及解析
- 税务责任追究管理办法
- 留学归国落户管理办法
- 2025年4.15全民国家安全教育日知识竞赛题汇编附答案
- 2024版电网公司反事故措施(2024版)
- 退伍军人离队安全教育培训纲要
- 办案安全自查和整改情况报告
- 2025年贵州省中考理科综合(物理化学)试卷真题(含答案详解)
- 工地剪彩活动方案
- 看守所突发事件应急预案
- 酒店卫生培训课件
- 科研中试基地管理制度
- 威士忌知识教学课件
- DB4403T 508-2024《生产经营单位锂离子电池存储使用安全规范》
- 2025届云南省红河州英语七下期末学业质量监测模拟试题含答案
评论
0/150
提交评论