皮皮网

【游戏源码csdn】【桂平到桂林源码】【资源源码分析】jtextpane源码

来源:非源码是什么 时间:2024-11-23 12:10:59

1.使用java开发代码编辑器(使用java开发代码编辑器的好处)

jtextpane源码

使用java开发代码编辑器(使用java开发代码编辑器的好处)

       java编程常用的软件有哪些

       æƒ³è¦åšå¥½Java开发,没有常用的开发工具可不行。而Java初学者往往处于对Java还一知半解的状态,对于Java开发工具的了解也不会太多,常常会为了找开发工具而浪费大量的时间。给大家介绍下Java开发工程师常用的开发工具有哪些。

       ç¬¬ä¸€ä¸ªJava常用的开发工具为JDK,也叫Java软件开发工具包,是一个编写Java的Applet小程序和应用程序的程序开发环境,JDK中还包括了Java的开发环境,所以下载了JDK就包含了Java开发环境。而且JDK之所以被叫做Java软件开发工具包,是因为它包含了其它Java开发工具,如:编译工具(javac.exe)、打包工具(jar.exe)等。

       ç¬¬äºŒä¸ªæ˜¯JavaIDE:Eclipse,Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。而且由于它的平等和一致性,使得其它开发语言也可以在eclipse上使用。

       ç¬¬ä¸‰ä¸ªæ˜¯notepad++,notepad++是一个编译工具,它的优点是即使你把文件删掉了,如果再notepad++中打开过,那么那里就会保留,所以对一些容易误删的人来说比较友好,notepad++可以用来替代notepad。

       ç¬¬å››ä¸ªæ˜¯VisualStudioCode,它是一个运行于MacOSX、Windows和Linux之上的跨平台源代码编辑器。而且这个编辑器支持多种语言和格式的编写。

       ä»¥ä¸Šå°±æ˜¯æ¯”较常用的4种Java开发工具,Java的初学者在对开发工具不了解的情况下,可以根据上述介绍来选择适合自己的开发工具,这样可以减少自己到处找开发工具还可能找到不适合的所浪费的时间。

       å¦‚何用java编写一个简单的文本编辑器?

       importjava.awt.*;\x0d\importjava.awt.event.*;\x0d\importjavax.swing.*;\x0d\importjava.io.*;\x0d\\x0d\publicclassf1extendsFrameimplementsActionListener\x0d\{ \x0d\privateMenuBarmenubar=newMenuBar();\x0d\privateMenufilemenu=newMenu("文件");\x0d\privateMenueditmenu=newMenu("编辑");\x0d\privateMenuformmenu=newMenu("格式");\x0d\privateMenuItem[]itemf=newMenuItem[4];\x0d\privateMenuItem[]iteme=newMenuItem[6];\x0d\privateMenuItem[]items=newMenuItem[2];\x0d\privateTextAreatf=newTextArea();\x0d\\x0d\publicinta=0,游戏源码csdnb=0,c=0,style=Font.PLAIN,size=;\x0d\publicStrings1="red:"+a+""+"green:"+b+""+"blue"+c,\x0d\s2="宋体";\x0d\\x0d\publicString[]sz1={ "","","","","",""},\x0d\sz2={ "宋体","黑体","幼圆","隶书","行楷","Arial","Georgia"},\x0d\sz3={ "粗体","倾斜","常规","粗斜"};\x0d\\x0d\JDialogdialog=newJDialog(this,"字体",true);\x0d\Containercp=dialog.getContentPane();\x0d\JLabel[]lb=newJLabel[8];\x0d\JLabellb1=newJLabel(s1,JLabel.LEFT);\x0d\JButtonb1=newJButton("确定"),\x0d\b2=newJButton("取消");\x0d\JComboBoxjc1=newJComboBox(),\x0d\jc2=newJComboBox(),\x0d\jc3=newJComboBox();\x0d\JScrollBarjb1=newJScrollBar(JScrollBar.HORIZONTAL,,5,0,);\x0d\JScrollBarjb2=newJScrollBar(JScrollBar.HORIZONTAL,,5,0,);\x0d\JScrollBarjb3=newJScrollBar(JScrollBar.HORIZONTAL,,5,0,);

java源代码编辑器设计用于编写Java源代码的编辑器,基本要求:可以完成源程序的文件打开,编辑和文件保存

       ä¸€.高亮的内容:

       éœ€è¦é«˜äº®çš„内容有:

       1.关键字,如public,int,true等.

       2.运算符,如+,-,*,/等

       3.数字

       4.高亮字符串,如"exampleofstring"

       5.高亮单行注释

       6.高亮多行注释

       äºŒ.实现高亮的核心方法:

       StyledDocument.setCharacterAttributes(intoffset,intlength,AttributeSets,booleanreplace)

       ä¸‰.文本编辑器选择.

       Java中提供的多行文本编辑器有:JTextComponent,JTextArea,JTextPane,JEditorPane等,都可以使用.但是因为语法着色中文本要使用多种风格的样式,所以这些文本编辑器的document要使用StyledDocument.

       JTextArea使用的是PlainDocument,æ­¤document不能进行多种格式的着色.

       JTextPane,JEditorPane使用的是StyledDocument,默认就可以使用.

       ä¸ºäº†å®žçŽ°è¯­æ³•ç€è‰²,可以继承自DefaultStyledDocument,设置其为这些文本编辑器的documet,或者也可以直接使用JTextPane,JEditorPane来做.为了方便,这里就直接使用JTextPane了.

       å››.何时进行着色.

       å½“文本编辑器中有字符被插入或者删除时,文本的内容就发生了变化,这时检查,进行着色.

       ä¸ºäº†ç›‘视到文本的内容发生了变化,要给document添加一个DocumentListener监听器,在他的removeUpdate和insertUpdate中进行着色处理.

       è€ŒchangedUpdate方法在文本的属性例如前景色,背景色,字体等风格改变时才会被调用.

       @Override

       publicvoidchangedUpdate(DocumentEvente){

       }

       @Override

       publicvoidinsertUpdate(DocumentEvente){

       try{

       colouring((StyledDocument)e.getDocument(),e.getOffset(),e.getLength());

       }catch(BadLocationExceptione1){

       e1.printStackTrace();

       }

       }

       @Override

       publicvoidremoveUpdate(DocumentEvente){

       try{

       //因为删除后光标紧接着影响的单词两边,所以长度就不需要了

       colouring((StyledDocument)e.getDocument(),e.getOffset(),0);

       }catch(BadLocationExceptione1){

       e1.printStackTrace();

       }

       }

       äº”.着色范围:

       pos:指变化前光标的位置.

       len:指变化的字符数.

       ä¾‹å¦‚有关键字public,int

       å•è¯"publicint",在"public"和"int"中插入一个空格后变成"publicint",一个单词变成了两个,这时对"public"和"int"进行着色.

       ç€è‰²èŒƒå›´æ˜¯public中p的位置和int中t的位置加1,即是pos前面单词开始的下标和pos+len开始单词结束的下标.所以上例中要着色的范围是"publicint".

       æä¾›äº†æ–¹æ³•indexOfWordStart来取得pos前单词开始的下标,方法indexOfWordEnd来取得pos后单词结束的下标.

       publicintindexOfWordStart(Documentdoc,intpos)throwsBadLocationException{

       //从pos开始向前找到第一个非单词字符.

       for(;pos0isWordCharacter(doc,pos-1);--pos);

       returnpos;

       }

       publicintindexOfWordEnd(Documentdoc,intpos)throwsBadLocationException{

       //从pos开始向前找到第一个非单词字符.

       for(;isWordCharacter(doc,pos);++pos);

       returnpos;

       }

       ä¸€ä¸ªå­—符是单词的有效字符:是字母,数字,下划线.

       publicbooleanisWordCharacter(Documentdoc,intpos)throwsBadLocationException{

       charch=getCharAt(doc,pos);//取得在文档中pos位置处的字符

       if(Character.isLetter(ch)||Character.isDigit(ch)||ch=='_'){ returntrue;}

       returnfalse;

       }

       æ‰€ä»¥ç€è‰²çš„范围是[start,end]:

       intstart=indexOfWordStart(doc,pos);

       intend=indexOfWordEnd(doc,pos+len);

       å…­.关键字着色.

       ä»Žç€è‰²èŒƒå›´çš„开始下标起进行判断,如果是以字母开或者下划线开头,则说明是单词,那么先取得这个单词,如果这个单词是关键字,就进行关键字着色,如果不是,就进行普通的着色.着色完这个单词后,继续后面的着色处理.已经着色过的字符,就不再进行着色了.

       publicvoidcolouring(StyledDocumentdoc,intpos,intlen)throwsBadLocationException{

       //取得插入或者删除后影响到的单词.

       //例如"public"在b后插入一个空格,就变成了:"public",这时就有两个单词要处理:"pub"和"lic"

       //这时要取得的范围是pub中p前面的位置和lic中c后面的位置

       intstart=indexOfWordStart(doc,pos);

       intend=indexOfWordEnd(doc,pos+len);

       charch;

       while(startend){

       ch=getCharAt(doc,start);

       if(Character.isLetter(ch)||ch=='_'){

       //如果是以字母或者下划线开头,说明是单词

       //pos为处理后的最后一个下标

       start=colouringWord(doc,start);

       }else{

       //SwingUtilities.invokeLater(newColouringTask(doc,pos,wordEnd-pos,normalStyle));

       ++start;

       }

       }

       }

       publicintcolouringWord(StyledDocumentdoc,intpos)throwsBadLocationException{

       intwordEnd=indexOfWordEnd(doc,pos);

       Stringword=doc.getText(pos,wordEnd-pos);//要进行着色的单词

       if(keywords.contains(word)){

       //如果是关键字,就进行关键字的着色,否则使用普通的着色.

       //这里有一点要注意,在insertUpdate和removeUpdate的方法调用的过程中,不能修改doc的属性.

       //但我们又要达到能够修改doc的属性,所以把此任务放到这个方法的外面去执行.

       //实现这一目的,可以使用新线程,但放到swing的事件队列里去处理更轻便一点.

       SwingUtilities.invokeLater(newColouringTask(doc,pos,wordEnd-pos,keywordStyle));

       }else{

       SwingUtilities.invokeLater(newColouringTask(doc,pos,wordEnd-pos,normalStyle));

       }

       returnwordEnd;

       }

       å› ä¸ºåœ¨insertUpdate和removeUpdate方法中不能修改document的属性,所以着色的任务放到这两个方法外面,所以使用了SwingUtilities.invokeLater来实现.

       privateclassColouringTaskimplementsRunnable{

       privateStyledDocumentdoc;

       privateStylestyle;

       privateintpos;

       privateintlen;

       publicColouringTask(StyledDocumentdoc,intpos,intlen,Stylestyle){

       this.doc=doc;

       this.pos=pos;

       this.len=len;

       this.style=style;

       }

       publicvoidrun(){

       try{

       //这里就是对字符进行着色

       doc.setCharacterAttributes(pos,len,style,true);

       }catch(Exceptione){ }

       }

       }

       ä¸ƒ:源码

       å…³é”®å­—着色的完成代码如下,可以直接编译运行.对于数字,运算符,字符串等的着色处理在以后的教程中会继续进行详解.

       importjava.awt.Color;

       importjava.util.HashSet;

       importjava.util.Set;

       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;

       publicclassHighlightKeywordsDemo{

       publicstaticvoidmain(String[]args){

       JFrameframe=newJFrame();

       JTextPaneeditor=newJTextPane();

       editor.getDocument().addDocumentListener(newSyntaxHighlighter(editor));

       frame.getContentPane().add(editor);

       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       frame.setSize(,);

       frame.setVisible(true);

       }

       }

       /

**

       *当文本输入区的有字符插入或者删除时,进行高亮.

       

*

       *要进行语法高亮,文本输入组件的document要是styleddocument才行.所以不要用JTextArea.可以使用JTextPane.

       

*

       *@authorBiao

       

*

       */

       classSyntaxHighlighterimplementsDocumentListener{

       privateSetStringkeywords;

       privateStylekeywordStyle;

       privateStylenormalStyle;

       publicSyntaxHighlighter(JTextPaneeditor){

       //准备着色使用的样式

       keywordStyle=((StyledDocument)editor.getDocument()).addStyle("Keyword_Style",null);

       normalStyle=((StyledDocument)editor.getDocument()).addStyle("Keyword_Style",null);

       StyleConstants.setForeground(keywordStyle,Color.RED);

       StyleConstants.setForeground(normalStyle,Color.BLACK);

       //准备关键字

       keywords=newHashSetString();

       keywords.add("public");

       keywords.add("protected");

       keywords.add("private");

       keywords.add("_int9");

       keywords.add("float");

       keywords.add("double");

       }

       publicvoidcolouring(StyledDocumentdoc,intpos,intlen)throwsBadLocationException{

       //取得插入或者删除后影响到的单词.

       //例如"public"在b后插入一个空格,就变成了:"public",这时就有两个单词要处理:"pub"和"lic"

       //这时要取得的范围是pub中p前面的位置和lic中c后面的位置

       intstart=indexOfWordStart(doc,pos);

       intend=indexOfWordEnd(doc,pos+len);

       charch;

       while(startend){

       ch=getCharAt(doc,start);

       if(Character.isLetter(ch)||ch=='_'){

       //如果是以字母或者下划线开头,说明是单词

       //pos为处理后的最后一个下标

       start=colouringWord(doc,start);

       }else{

       SwingUtilities.invokeLater(newColouringTask(doc,start,1,normalStyle));

       ++start;

       }

       }

       }

       /

**

       *对单词进行着色,并返回单词结束的下标.

       

*

       *@paramdoc

       *@parampos

       *@return

       *@throwsBadLocationException

       */

       publicintcolouringWord(StyledDocumentdoc,intpos)throwsBadLocationException{

       intwordEnd=indexOfWordEnd(doc,pos);

       Stringword=doc.getText(pos,wordEnd-pos);

       if(keywords.contains(word)){

       //如果是关键字,就进行关键字的着色,否则使用普通的着色.

       //这里有一点要注意,在insertUpdate和removeUpdate的方法调用的过程中,不能修改doc的属性.

       //但我们又要达到能够修改doc的属性,所以把此任务放到这个方法的外面去执行.

       //实现这一目的,可以使用新线程,但放到swing的事件队列里去处理更轻便一点.

       SwingUtilities.invokeLater(newColouringTask(doc,pos,wordEnd-pos,keywordStyle));

       }else{

       SwingUtilities.invokeLater(newColouringTask(doc,pos,wordEnd-pos,normalStyle));

       }

       returnwordEnd;

       }

       /

**