疯狂实战演义源码第08章简单javaide工具_第1页
疯狂实战演义源码第08章简单javaide工具_第2页
疯狂实战演义源码第08章简单javaide工具_第3页
疯狂实战演义源码第08章简单javaide工具_第4页
疯狂实战演义源码第08章简单javaide工具_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8章简单JavaIDE8JavaIDE分析功能、编译功能、debug功能等的开发套件。例如Java程序员经常使用的像Eclipse、NetBeans、JBuilder等这些功能强大的IDE工具。JavaIDE文件、的新建界面。8.1不可编辑的JTextArea对象。新建程序Main类,作为这个IDE工具的。publicclassMainpublicclassMainpublicstaticvoidmain(String[]args)EditorFrameeditorFrame=newEditorFrame("ide");}}publicclassEditorFrameextends{publicEditorFrame(Stringsuper(title}} 我们可以新建一个initFrame的方法,该方法主要用来创建这个JFrame里面的各个组件。privateJSplitPaneeditorSplitPane;//用于分隔主编辑区和信息显示区的容器privateJTextAreainfoArea;//用于显示信息的文本域publicvoidinitFrame()setDefaultCloseOperation(JFrame.EXITONCLOSE);tabPanenewJTabbedPane(JTabbedPane.TOPJTabbedPane.SCROLLTABLAYOUTdesk=newJDesktopPane();//创建JDesktopPane对象box=newBox(BoxLayout.Y_AXIS);//设置box的布局,infoPanenewJScrollPane(infoAreainfoArea文本域作为组件放到infoPane;//editorSplitPaneeditorSplitPane=newJSplitPane(JSplitPane.VERTICALSPLIT,box,infoPane);}以上代码创建了主编辑区和信息显示区,主编辑区主要是一个Box对象,该对象里面有8.2Java源文件出错,运行类打印的一些信息等。在编辑区主的Box对象中,还有一个tab页对象,现在新建了界面,在本章会实现该JTabbedPane对象的创建(打开,切换等功能。privateJTreetree;//privateJTreetree;//项目树对象publicvoidinitFrame()…);//mainSplitPanenewJSplitPane(JSplitPane.HORIZONTALSPLITmainSplitPane.setDividerSize(3);//设置分隔条的粗细}8.3在8.3.2中建立了主界面的布局后,接下来为这个IDE工具添加菜单和,并为它们添加器。主要的文件操作菜单有新建(文件、和项目、打开、保存、刷新、运行和退出。文本操作菜的加的加privateJprivate privateJprivate ;// ;//privateActionfileNew=Action("新建文件new{publicvoidactionPerformed(ActionEvente)} publicvoidaddListeners() }publicvoidinitFrame()…Bar=newedit=newfile=newJsetJBar);//设置JFrame的菜单栏}ActionActionActionactionPerformed如图8.4所示。8.4接下来,为IDE工具添 ,并为中的各个功能设置对应的Action对象。使用中的JToolBar类可实现 //工具 publicvoidinitFrame()…toolBar=newJToolBar();toolBar.setMargin(newInsets(0,10,5,5));//设 的边 } publicvoidaddListeners() …}8.5添加 8.6Eclipse中选择工作空间的界面,我们所定的界面只需要有一个文件选择器,让用户去选择工作空间的,并有一个文本框显示该的全路径,再有确定和取消的按钮。我们创建一个SpaceFrame的类用于建立工作空间选择界面。8.7创建工作空间选择界面(SpaceFrame类注意,图8.7中的确定按钮为不可用,由于没有选择工作空间,那么该按钮就不可以点击,使用 文件、和项目的界面。该界面只需要一个文本框,用于输入文件名称、名称和项目名称,并有确定和取消的按钮,暂时不需要加上,所以实现比较简单。实现的效果如图8.8所示。8.8privateJPanelnamePanel;//项目名称privateJLabelnameLabel;//显示文件的JLabelprivateJPanelbuttonPanel;//放按钮的PanelprivateJButtoncancelButton取消按钮publicAddFrame(){mainPanel=newJPanel();namePanelnewJPanel();=nameText=newJTextField("",20);buttonPanel=newJPanel();cancelButtonnewJButton("取消");mainPanel.setLayout(newBoxLayout(mainPanel,BoxLayout.YAXIS));setLocation(200,200);//设置存放文本框的JPanelnamePanel.setLayout(newBoxLayout(namePanel,BoxLayout.XAXIS));buttonPanel.setLayout(newBoxLayout(buttonPanel,BoxLayout.XAXIS));buttonPanel.add(newJLabel(" //JPanel和按钮的JPanel添加到mainPanel//mainPanel添加到JFrame} Eclipse那样,进入时选择工作空间。8.3.4小节,我们已经创建了选择工作空间的界面,如图8.7所示。那么现在,我们就围绕变为不可见,并将该对象当作参数传给工作空间的JFrame类(SpaceFrame类)publicstaticvoidpublicstaticvoidmain(String[]args)=//将editorFrame对象作为SpaceFrame的构造参数SpaceFramespaceFramenewSpaceFrame(editorFrame);spaceFrame.setVisible(true);//让SpaceFrame可见}将EditorFrame传给SpaceFrame,因为在SapceFrame中选择了工作空间( 在选择工作空间时,我们需要一个文件选择器用于选择文件,并且只能选择8.8中的文间的。;//{this.chooser=}chooser.showOpenDialog(null);//显示这个文件选择器}}ChoseButtonListener的构造参数中需要一个文件选择器对象,因此我们需要创建一个文件选{privateSpaceFramethis.spaceFrame}=spaceFrame.setFolder(folder);//设置SpaceFrame的属性folder的值spaceFrame.getConfirmButton().setEnabled(true);//设置确定按钮可用}}}文件,当用户利用文件选择器选择了文件SpaceFrameJTextFiedlpathText的值设属性,pathText属性与confirmButton属性的代码如下。 privateJTextFieldpathText;privateJButton privateFile这三个属性中,folder属性需要提供setter和getter属性,pathText(路径显示文本框)创建完文件选择器后,可以SpaceFrame中的选择按钮添加器,该器就是上面 privateJButtonchoseButton; }8.9 的界面如图8.10所示8.10选择完工作空间后,显示的文本框就出现了所选的的绝对路径,确定按钮也变得可用了,这也空间的绝对路径传给EditorFrame,告诉它选择了的,那么EditorFrame将会以这个作为工作的。当选择完工作空间后,需要告诉EditorFrame选择了哪个 去创建项目树。在EditorFrame类中,创建界面的是initFrame方法,因此,只需要为方法传入一个对象即可。先创建一个工 的对象:WorkSpace类,该类需要保存工作空间FilepublicclassWorkSpacepublicclassWorkSpacepublicWorkSpace(Filefolder){this.folder=}}下面,再为工作空间选择的确定按钮添加一个器,ConfirmButtonListener类,用于处理用户点{privateSpaceFramespaceFrame;privateEditorFrameeditorFrame;{this.spaceFrame=spaceFrame;this.editorFrame=editorFrame;}//调EditorFrame的initFrame方法初始化界面editorFrame.setVisible(true);//将EditorFrame设为可见spaceFrame.setVisible(false);//让工作选择空间界面不可见}} 与editorFrame作为构造参数, {this.workSpace=}Main类,可以看到当我们选择了工作空间,并点击了确定后,我们的编辑主界面就EditorFrameWorkSpace的对象,该对象里面有工作空间的及对应的EditorFrameWorkSpace对象来创建项目显示privateFilefile>{super(file.getName(),allowsChildren);this.file=file;=}}ProjectTreeNode对象里有该节点所对应的文件属性(也可以是),该节点的子节点集合,每创DefaultTreeModel类,暂时只提供一个{}}{publicProjectTreeSelectionListener()}publicvoidmousePressed(MouseEvente)}}这样可以减低代码的耦合,EditorFrame根本不需要理会TreeCreator是如何去创建树的。新建publicinterfaceTreeCreatorpublicinterfaceTreeCreator }中创建EditorFrame对象的代码。privateTreeCreatorprivateTreeCreatorpublicEditorFrame(Stringtitle,TreeCreator{super(title);//设置标题}…publicstaticvoidmain(String[]args)=EditorFrameeditorFrame=newEditorFrame("ide",//将editorFrame对象作为SpaceFrame的构造参数SpaceFramespaceFramenewSpaceFrame(editorFrame);spaceFrame.setVisible(true);//让SpaceFrame可见}代码publicvoidinitFrame(WorkSpacepublicvoidinitFrame(WorkSpaceworkSpace)tree=}到工作空间的,这样,再通过一定的规则查找工作空间下的项目。本例使用的规则为查找工作空间下以.project结尾的文件,如果查找到一份,就确定该工作空间有一个项目,再通字符串截取获得项目存在于这个工作空间下。规则已经制定,那么现在就可以去实现createTree方法了。=//创建树的根节点ProjectTreeNodeProjectTreeModeltreeModelnewProjectTreeModel(root以根节点建立一个树模型对象returnnewJTree(treeModel);}的效果如图8.11。8.11 {List<String>result=newfor(Filefile:spaceFolder.listFiles())}}return} List<File>List<File>result=newfor(StringprojectName:{for(Filefile:files) if}}}return} 下有一个ject的文件,但是却没有相对应的项目 现在可以去创建节点的对象,树中的每一个节点都对应一个ProjectTreeNode对象,每一个ProjectTreeNode对象下面都可能有它的子节点,之所以说是可能,是因为在我们当前的情况下,该节点(ProjectTreeNode)的file属性是 privateList<ProjectTreeNode>createNodes(File{File[]files=folder.listFiles();//获取该 for(Filefile:files) }for(Filefile:files) }return publicProjectTreeNodecreateNode(Filefolder)ProjectTreeNodeparent=null; if(!folder.isDirectory())returnreturnnewProjectTreeNode(folder,}else parent=newProjectTreeNode(folder,}for(ProjectTreeNodenode:nodes)//递归创建子节点,并将返回的节点添加到parent}return}FilespaceFolder=//创建树的根节点ProjectTreeNodeProjectTreeModeltreeModelnewProjectTreeModel(root);//以根节点建立一个树模型对象JTreetree=newJTree(treeModel);//创建树对象 List<File>projectFolders= for(inti=0;i<projectFolders.size();i++)FileprojectFolder= }return} 可以看到的效果如图8.12所示。8.12 在一般的工作空间下,只会显示各个项目,因此,可以将这棵树的根节点隐藏,使用 ,使用,使用 publicclassImageUtilpublicstaticStringFOLDER_CLOSE="images/folder-close.gif";// publicstaticStringFOLDER_OPEN="images/folder-open.gif";// publicstaticStringFILE="images/file.gif";//无子节点的文件returntree;}的 DefaultTreeCellRendererrenderer=newDefaultTreeCellRenderer();//定制节点renderer.setOpenIcon(ImageUtil.getImageIcon(ImageUtil.FOLDER_OPEN));// renderer.setLeafIcon(ImageUtil.getImageIcon(ImageUtil.FILE));//节点没有子节点的renderer.setClosedIcon(ImageUtil.getImageIcon(ImageUtil.FOLDER_CLOSE));// tree.setCellRenderer(renderer);//设置树的部件处理类为上面的renderertree.setRootVisible(false);//设置树的根节点不可见return}publicstaticImagegetImage(String{returnImageIO.read(new}{returnnew}有自动展开,我们可以获取树的根,再对其进行展开(创建的时候TreePathpathnewTreePath(root)创建根在项目树中的路径tree.expandPath(path);//让树默认展开根节点tree.setRootVisible(false);//设置树的根节点不可见return}8.13在8.5.1中,已经创建了树的各个相关的类,其中就包括树的节点的点击类,当时创建该类的时候并没有对它进行实现,现在我们的树已经成型了,可以对加入节点的选择。首先我们需要明白点击节点时需要做一些什么样的事情,当点击节点的时候,如果点击的是一个,那么就展开这个目JTree已经帮我们实现了,如果点击的是一个普通节点(普通文件,那么就将该节点的文件内容显示到EditorFrame中的主编辑区的文本编辑域中。现在我们先开发一个文件内容的工具类,在点树节点的时候节点(文件)的内容,这样在器的类,就不需要关心如何去文件了。新建一个FileUtil的类。 publicstaticStringreadFile(File{StringBufferresult=newStringBuffer();try{ Stringcontent=byte[]arr=newbyte[1024];intreadLength;while((readLength=fis.read(arr))>0)content=newString(arr,0,}}catch(IOExceptione)thrownewFileException("read'"+file.getAbsolutePath()+"'file}return}是自定义异常类,继承ProjectTreeSelectionListenermousePressedProjectTreeSelectionListenermousePressed 文件的方法获取文件内容 return}//将主界面的frame(EditorFrame)作为构造参数传 this.editorFrame=editorFrame;}if(path!=null){returnselectNode;}returnnull;}publicvoidmousePressed(MouseEvente) }这时需要在EditorFrame中新建一个openFile方法,参数是File对象,暂时提供空实现,需要处理打开这一节,实现文件的操作功能,包括新建文件、和项目,文件的打开、保存、运行、刷 publicvoid dd(EditorFrameeditorFrame,AddFrameaddFrame, publicvoid dd(EditorFrameeditorFrame,AddFrameaddFrame,Objectdata)}publicinterfaceAddHandlervoid dd(EditorFrameeditorFrame,AddFrameaddFrame,Object}AddInfo的类,用于保存这些信息。publicclassAddInfopublicclassAddInfoprivateStringinfo;//字符串,text前显示,例如:privateAddHandlerhandler;//新增完后的处理类publicAddInfo(Stringinfo,EditorFrameeditorFrame,AddHandler{=info;this.handler=handler;}…}privateAddFrameprivateAddFrameprivateActionfileNew=Action("新建文件new{publicvoidactionPerformed(ActionEvente){}AddInfoinfonewAddInfo("文件名称:this,new}privatevoidshowAddFrame(AddInfoinfo)} 注:需要修改AddFrame的构造器,需要一个AddInfo上面代码中新增了两个方法,实现了新建文件的菜单,显示添加的界面,并将AddInfo对象传到AddFrame中,这样AddFrame就知道如何显示对应的文字,添加完后就可以调用AddInfo中的AddHandler类去处理添加动作,至于怎样处理,AddFrame完全不用关心。只负责调用AddHandler的方法即可。我们需要明确AddFrame所要做的事情:文本框值改变的器取消按钮的窗口关闭的确定按钮的 = publicvoidpublicvoid dd(EditorFrameeditorFrame,AddFrameaddFrame,Object{=FilefolderselectNode.getFile();////如果folder不是一 ,则用selectNode的父节点(是一if(!folder.isDirectory())selectNode=parent;folder=}FilenewFile=newFile(folder.getAbsoluteFile()+File.separator+data);model.reload(selectNode);//重新加载所选择的节点editorFrame.setEnabled(true);//使主编辑frame可用addFrame.setVisible(false)frame} 运行Main类,并进行新建文件的操作,可以发现在某个 publicvoidreload(ProjectTreeNodepublicvoidreload(ProjectTreeNodenode,TreeCreatorcreator)parent.insert(node,index);//添加到父节点中}EditorFrame中提供返回树对象(getTree){if(selectNode==null)ProjectTreeModelmodel=} 8.158.16privateActionrefresh=privateActionrefresh= {publicvoidactionPerformed(ActionEvente){} publicvoid dd(EditorFrameeditorFrame,AddFrameaddFrame,Object publicvoid dd(EditorFrameeditorFrame,AddFrameaddFrame,ObjectProjectTreeNodeselectNodeeditorFrame.getSelectNode();//获得树中所选取的节点Filefolder=selectNode.getFile();//获取该节点所对应的文件对象//如果folder不是一 ,则用selectNode的父节点(是一 ifif(!folder.isDirectory())ProjectTreeNodeparent=(ProjectTreeNode)selectNode.getParent();selectNode=parent;//让当前所选择的文件的父 folder=parent.getFile();} FilenewFoldernewFile(folder.getAbsoluteFileFile.separatordata);editorFrame.setEnabled(true);//EditorFrame可用addFrame.setVisible(false);//frame不可见} privateActionfolerNew= ",new{publicvoidactionPerformed(ActionEvente){} publicvoidnewFolder()AddInfoinfonew 名称:thisnew} 与8.6.2的新建功能一样,只需要加多一个AddHandler的实现类,并为菜单加入器即可。AddProjectHandlerAddProjectHandler与新建文件、的实现有所不同,不仅是新建一个项目,还需要新建一个ject的项目对应文件,还需要新建一些与项目相关的,例如源文件(src,Java文件的编译(classes)等。新建完项目后,还需要刷新整棵树(刷新工作空间EditorFrame中提供一个刷新整棵树的方法,以便为这个实现类所调用。publicpublicvoidrefreshTree(JTreenewTree)this.tree=newTree;}在新建的时候,还需要有源文件所在的,编译等信息。新建一个CompileConfig类来 publicvoidaf dd(EditorFrameeditorFrame,AddFrameaddFrame,Objectdata){FileprojectFile=newFile(spaceFolder.getAbsoluteFile()+File.separator+data+".project"); //创建项目的 Filesrc=newFile(projectFolder.getAbsoluteFile()+File.separator+CompileConfig.SRCDIR);Fileoutput=newFile(projectFolder.getAbsoluteFile()+File.separator+CompileConfig.OUTPUTDIR);//创建srcoutput= }上面代码中的黑体部分分别创建ject文件、源文件存放和编译输出。新建完ject、源文件存放和编译后,再调用EditorFrame中的刷新整棵树的方法去刷新项目树。接下来再为EditorFrame类中的新建项目菜单添加器。privateActionprojectNew=Action("新建项目new{publicvoidactionPerformed(ActionEvente){}publicvoidnewProject()AddInfoinfonewAddInfo("项目名称:this,newAddProjectHandler());}8.178.18创建完项目后,IDE会帮我们创建src和classes 8.6.1AddHandler的接口,并对其进行具体不同的实现,它的实现类包括:AddFileHandler,AddFolderHandler,AddProjectHandler。在策略模式中的Context后调用该接口的afdd方法。在这里策略模式所体现的优势就是AddFrame不需要去理会AddHandler的具体实现,只需要在EditorFrame构造不同的AddHandlerAddFrame即可。在本章8.5.4中,已经实现了树节点的器,点击了树的某个节点的时候,就调用EditorFrameopenFile8.5.4openFile方法,在本小节中将会去实现这publicclassEditPaneextendspublicclassEditPaneextends{publicEditPane(File}}辑对象,新建JInternalFrame对象,最后设置JTabbedPane对象。publicvoidpublicvoidopenFile(Filefile)创建一个JInternalFrameiframe=newJInternalFrame(file.getAbsolutePath(),true,true,true,//新建一个EditPaneEditPaneeditPane=newEditPane(file);iframe.add(newJScrollPane(editPane));iframe.reshape(0,0,400,//tabPanetab页,tab页面的标题为文件名称,tab的tips为文件的绝对路径tabPane.addTab(file.getName(),null,null,file.getAbsolutePath());tabPane.setSelectedIndex(tabPane.getTabCount()-1);}8.19publicclassFileUtil publicclassFileUtil publicstaticStringreadFile(File{StringBufferresult=new Stringcontent=byte[]arr=newbyte[1024];intreadLength;while((readLength=fis.read(arr))>{content=newString(arr,0,}return}} publicEditPane(Filefile) }重新运行就可以看到文件的内容已经被EditPaneprivateActionopen {publicvoidactionPerformed(ActionEvente){}publicvoidselectFile()fileChooser=new}{privateEditorFramethis.editorFrame=editorFrame;}publicvoid{Filefile=//设置树当前选择的节点为null,让树没有被选中}} 能。新建一个EditFile的类,表示一个编辑的文件对象。publicclassEditFilepublicclassEditFileprivatebooleansaved;//该文件是否已经被保存privateJInternalFrameiframe;//该文件对应的窗口publicEditFile(Filefile,booleansaved,JInternalFrameiframe,EditPaneeditPane){}}}该类中包含了一个文件对象,一个表示是否被保存的布尔值,一个该文件对象所对应的JInternalFrame对象(JInternalFrame,还有该文件所对应的文本编辑器对象;//;//>=publicvoidopenFile(Filefile)EditFilecurrentFile=newEditFile(file,true,iframe,}…以上代码为EditorFrame设置了当前打开的文件(currentFile),并记录了所有打开的文件(openFiles(JInternalFrame(JInternalFrame}{if(currentFile!=null)}//在打开文件的集合中查找该文件,EditFileopenedFile=//如果文件已经打开了,调用openExistFileif(openedFile!={openExistFile(openedFile,file);return;}}//从本类中记录已经打开的文件集合中得到与参数file一样的EditFileprivateEditFilegetOpenFile(Filefile)for(EditFileopenFile:openFiles)}return}//file获取该file对应的tabprivateintgetFileIndex(Filefile)//如果从打开文件的集合中找不到与参数file对应的EditFile对象,返回-1EditFileopenFile=getEditFile(file);if(openFile==null)return-return}privateEditFilegetEditFile(Filefile)for(EditFileopenFile:openFiles)}return}//tips去tabPanepublicintgetTabIndex(Stringtips)for(inti=0;i<this.tabPane.getTabCount();i++)}return1;//tips没有在tabPane中,返回-}publicvoidopenExistFile(EditFileopenedFile,FilewillOpenFile)//iframethis.currentFile=}publicvoidopenNewFile(Filefile)JInternalFrameiframe=newJInternalFrame(file.getAbsolutePath(),true,true,true,tabPane.setSelectedIndex(tabPane.getTabCount()-1);this.currentFilethis.currentFile=newEditFile(file,true,iframe,}注意,以上代码的黑体部分,判断将被打开的文件是否已经被打开(openFiles集合中(currentFile设置当前打开文件的对象,再将该对象放到openFiles集合中。Maintab页时,对应的窗口并没有发生//主界面的privateEditorFrame{this.editorFrame=}publicvoidstateChanged(ChangeEvente)JTabbedPanetab=if(index==-1)return;JInternalFramecurrentFrame=EditFilecurrentFile=}}publicpublicJInternalFramegetIFrame(String{JInternalFrame[]iframes=desk.getAllFrames();for(JInternalFrameiframe:iframes){}return}{for(EditFileopenFile:openFiles)return}tab页的tabPane对象设置器。在EditorFrameaddListenersreturn}器运行Main类可看到效果,点击tab页,可看到窗口间的切换。接下来实现窗口对象的器,当新建一个IFrameListener类,作为窗口的器。privateEditorFrame{this.editorFrame=}publicvoidinternalFrameActivated(InternalFrameEvent{JInternalFrameiframe=editorFrame.getDesk().getSelectedFrame();inttapIndex=}//获取当前关闭操作所对应的JInternalFrameEditFileeditFile=}我们在EditorFrame中实现这两个方法。//询问是否要保存,public//询问是否要保存,publicvoidaskSave(EditFilefile)if(!file.isSaved()){intvalJOptionPane.showConfirmDialog(this是否要保存?询问",if(JOptionPane.YES_OPTION==val)}}}publicvoidsaveFile(EditFilefile)}EditFilecloseFileintindex=}intopenFilesIndex=if(this.openFiles.size()==1){this.currentFile=if(openFilesIndex==0){}elseif(openFilesIndex==(openFiles.size()-1))}else}}}privateintgetEditFileIndex(EditFile{for(inti=0;i<this.openFiles.size();{}return-注:代码中的askSave方法,是否弹出询问是根据当前编辑文件(EditFile)saved属性决定,如果需要保存,则执行saveFile方法(以上代码的黑体部分),该方法暂时提供空实现。在后面的在EditorFrame的构造器中创建IFrameListener对象,并在openNewFile方法中为新建的 实现了窗口的器后,可以运行MaintabpublicclassprivateEditorFrame {this.editorFrame=publicclassprivateEditorFrame {this.editorFrame=}publicvoidchangedUpdate( Evente){}publicvoidinsertUpdate( Evente){;属性为}publicvoid Evente)}publicvoidopenNewFile(Filefile) Listener(new} =publicEditPane(Filefile){=publicEditPane(Filefile){this.doc ();//,,,//}ElementElementroot= intline=root.ge g.setColor(newColor(230,230,230));//设置颜色g.fillRect(00this.getMargin().left10getSize().height)绘制行数矩形框g.setColor(newColor(40,40,40));//设置行号的颜色for(intcount=0,j=1;count<=line;count++,{g.drawString(String.valueOf(j),(int)((count+1)*1.5020*}}8.20EditPane.java中新建一个SyntaxFormatter类,用于stx文件,使用Scanner类进该文件进行分stxEditPane中对它里面的文本进行分析,遇到某些关键字,再使用SyntaxFormatter进行显示。classSyntaxFormatterclassSyntaxFormatterprivateMap<SimpleAttributeSet,ArrayList>=newHashMap<SimpleAttributeSet,SimpleAttributeSetnormalAttr=newSimpleAttributeSet();publicSyntaxFormatter(StringsyntaxFile){Scannerscaner=scaner=newScanner(newFile(syntaxFile));intcolor=-1; =new while(scaner.hasNextLine()){if .size()>0&&color>-1)SimpleAttributeSetatt=newSimpleAttributeSet();StyleConstants.setForeground(att,newColor(color)); }=newcolor=Integer.parseInt(line.substring(1),}elseif(line.trim().length()> }}if .size()>0&&color>-{SimpleAttributeSetatt=newSimpleAttributeSet();attMap.put(att, }}{return}publicvoidsetHighLight(Styled doc,Stringtoken,intstart,intlength){outer:for(SimpleAttributeSetatt:attMap.keySet()) for(Objectkeyword )currentAttributeSet=att;break}}}if(currentAttributeSet!=null){ else }}}protectedSyntaxFormatterformatterprotectedSyntaxFormatterformatternewSyntaxFormatter("java.stx");//privateSimpleAttributeSetquotAttrnewSimpleAttributeSet();privateintdocChangeStart=0;//保存文档改变的开始位置privateintdocChangeLength=0;//保存文档改变的长度=publicvoidsyntaxParse()Elementroot=doc.getDefaultRoo intcursorPos=this.getCaretPosition();//获取文档中光标插入符的位置intline= Elementpara );//=if(start>docChangeStart)start=intlength=para.getEndOffset()-if(length<docChangeLength)length=docChangeLength+Strings=doc.getText(start,String[]tokens=intcurStart=0;for(Stringtoken:tokens)//找出当前分析单词在sinttokenPos=s.indexOf(token,if(isQuot&&(token.endsWith("\"")||token.endsWith("\'"))) ttributes(start+tokenPos,token.length(),quotAttr,false);isQuot=false;}elseif(isQuot&&!(token.endsWith("\"")||{ ttributes(start+tokenPos,token.length(),quotAttr,}elseif((token.startsWith("\"")||token.startsWith("\'"))&&(token.endsWith("\"")||token.endsWith("\'"))){ }elseif((token.startsWith("\"")||token.startsWith("\'"))&&!(token.endsWith("\"")||token.endsWith("\'"))){ ttributes(start+tokenPos,token.length(),quotAttr,false);isQuot=true;}elseformatter.setHighLight(doc,token,start+tokenPos,}curStart=tokenPos+}}publicEditPane(Filethis.doc=getStyled publicEditPane(Filethis.doc=getStyled ,,,// this.addKeyListener(newKeyAdapter(){publicvoidkeyReleased(KeyEventke){}}在文件打开的时候(构造EditPane的时候就对文本进行分析并进行 进行键盘点击就进行语法分析。运行Main类,可以看到效果如图8.21所示。图8.21实现显示功要保存文件,当时尚未实现saveFile方法,现在对saveFile作一个简单的实现。publicvoidpublicvoidsaveFile(EditFilefile)//设置操作的EditFile}publicstaticvoidwriteFile(Filefile,String{FileOutputStreamfospublicstaticvoidwriteFile(Filefile,String{FileOutputStreamfos=newFileOutputStream(file);PrintStreamps=newPrintStream(fos);}这样就可以实现文件的保存,但是,在实际情况下,如果要保存一份Java文件的话,保存的时候 存,再新建一个JavaSaveHandlerCommonSaveHandler类,该类处理保存Java文件。publicStringpublicStringsave(EditorFrame{EditFileeditFile=return publicFilegetCurrentProject(){ProjectTreeNoderoot=ProjectTreeNodeselectNode=getSelectNode();if(selectNode!=null)for(Proje

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论