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){
}
publicvoidinsertUpdate(DocumentEvente){
try{
colouring((StyledDocument)e.getDocument(),e.getOffset(),e.getLength());
}catch(BadLocationExceptione1){
e1.printStackTrace();
publicvoidremoveUpdate(DocumentEvente){
//因为删除后光标紧接着影响的单词两边,所以长度就不需要了
colouring((StyledDocument)e.getDocument(),e.getOffset(),0);
五.着色范围:
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{
for(;isWordCharacter(doc,pos);++pos);
一个字符是单词的有效字符:是字母,数字,下划线.
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后面的位置
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));
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(){
//这里就是对字符进行着色
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(500,500);
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");
SwingUtilities.invokeLater(newColouringTask(doc,start,1,normalStyle));
*对单词进行着色,并返回单词结束的下标.
*@paramdoc
*@parampos
*@return
*@throwsBadLocationException
Stringword=doc.getText(pos,wordEnd-pos);
*取得在文档中下标在pos处的字符.
*如果pos为doc.getLength(),返回的是一个文档的结束符,不会抛出异常.如果pos0,则会抛出异常.
*所以pos的有效值是[0,doc.getLength()]
publicchargetCharAt(Documentdoc,intpos)throwsBadLocationException{
returndoc.getText(pos,1).charAt(0);
*取得下标为pos时,它所在的单词开始的下标.±wor^d±(^表示pos,±表示开始或结束的下标)
*取得下标为pos时,它所在的单词结束的下标.±wor^d±(^表示pos,±表示开始或结束的下标)
*如果一个字符是字母,数字,下划线,则返回true.
charch=getCharAt(doc,pos);
*完成着色任务
一、EditplusEditPlus是功能很全面的文本、HTML、程序源代码编辑器。
默认的支持HTML、ASP、Perl、C/C++、CSS、PHP、Java、java和VB的语法着色。
通过定制语法文件还可以扩展到其他程序语言。
可以在Tools菜单的ConfigureUserTools菜单项配置用户工具,类似于UltraEdit的配置,配置好Java的编译器Javac和解释器Java后,通过EditPlus的菜单可以直接编译执行Java程序。
二、UltraEdit初学者一般用什么开发工具UltraEdit是一个功能强大的文本、HTML、程序源代码编辑器。
作为源代码编辑器,它的默认配置可以对C/C++,VB,HTML,Java和Perl进行语法着色。
用它设计Java程序时,可以对Java的关键词进行识别并着色,方便了Java程序设计。
它具有完备的复制、粘贴、剪切、查找、替换、格式控制等编辑功能。
可以在Advanced菜单的ToolConfiguration菜单项配置好Java的编译器Javac和解释器Java,直接编译运行Java程序。
三、Eclipse初学者一般用什么开发工具Eclipse是一个开放可扩展的集成开发环境(IDE)。
它不仅可以用于Java的开发,通过开发插件,它可以构建其他的开发工具。
Eclipse是开放源代码的项目,并可以免费下载。
建议使用Releases或StableBuilds版本。
四、JcreatorJcreator是一个用于Java程序设计的集成开发环境,具有编辑、调试、运行Java程序的功能。
这个软件比较小巧,对硬件要求不是很高,完全用C++写的,速度快、效率高。
java课程认为具有语法着色、代码参数提示、工程向导、代码自动完成、类向导等功能。
先进次启动时提示设置JavaJDK主目录及JDKJavaDoc目录,软件自动设置好类路径、编译器及解释器路径,还可以在帮助菜单中使用JDKHelp。
但目前这个版本对中文支持性不好。
1、SublimeText
SublimeText是一个代码编辑器也是HTML和散文先进的文本编辑器。漂亮的用户界面和非凡的功能,例如迷你地图,多选择,Python的插件,代码段,等等。完全可自定义键绑定,菜单和工具栏。SublimeText的主要功能包括:拼写检查,书签,完整的PythonAPI,Goto功能,即时项目切换,多选择,多窗口等等。
2、Dreamweaver
AdobeDreamweaver使用所见即所得的接口,亦有HTML(标准通用标记语言下的一个应用)编辑的功能,借助经过简化的智能编码引擎,轻松地创建、编码和管理动态网站。访问代码提示,即可快速了解HTML、CSS和其他Web标准。使用视觉辅助功能减少错误并提高网站开发速度。
3、VisualStudioCode
VisualStudioCode中文版是微软推出的带GUI的代码编辑器,软件功能非常强大,界面简洁明晰、操作方便快捷,设计得很人性化。软件主要改进了文档视图,完善了对Markdown的支持,新增PHP语法高亮。
4、HBuilder
HBuilder是专为前端打造的开发工具,具有飞一样的编码、最全的语法库和浏览器兼容数据、可以方便的制作手机APP、最保护眼睛的绿柔设计等特点。支持HTML、CSS、JS、PHP的快速开发。从开放注册以来深受广大前端朋友们的喜爱。
5、WebStorm
WebStorm是jetbrains公司旗下一款JavaScript开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScriptIDE”等。与IntelliJIDEA同源,继承了IntelliJIDEA强大的JS部分的功能。
1、Eclipse-IBM甩出来给开源社区的IDE,其本身就是使用Java开发的。\x0d\x0a2、MyEclipse-把Eclipse包装了一下,加了J2EE企业开发的许多功能强大的插件。\x0d\x0a3、NetBeans-SUN公司自己开发的Java开发环境,功能挺多的。\x0d\x0a4、还有一些超喜欢手工编写Java代码的牛人喜欢使用带语法着色功能的纯文本编辑器编写Java程序,代码写完后在命令提示符下编译运行。这种方式只适用写少量代码或作为学习使用,开发大型项目不适用,因为效率很低。
1.CodeSandbox(基于React的在线代码沙盒平台)我常用的
②地址:
③图示
2.CodePen(前端代码编辑运行的网站)
①CodePen是一个完全免费的前端代码托管服务,主要功能有:
3.JSRUN(支持手机端的在线JS编辑器)
①jsrun是一款支持手机端的在线JS编辑器,HTML/CSS/Javascript在线代码运行工具,js代码在线测试调试,是runjs的升级版支持vue.js/angular.js的在线编辑器
4.jsFiddle(前端代码编辑运行的网站)
5.Ideone(C和C++的在线编译和调试工具,支持其他的60种语言)我常用
①Ideone是C和C++的在线编译和调试工具,支持其他的60种语言。这个工具提供许多强大的功能,允许程序员快速高效的编译源代码
6.Codechef(C,C++和Java的在线编译工具)
①它支持C,C++和Java,非常接近真正的桌面IDE。这是超快速和易于使用。适合于课堂和作业的学生,练习面试问题。
7.JDoodle(C,C++和Java的在线IDE)
①支持协作代码。它只是从一个简单的文本区域开始,您可以粘贴代码,然后单击运行。您可以更改命令行参数并在运行该程序之前设置stdin。最适合新的在线编辑器不支持的许多旧语言。
8.OnlineGDB(在线C,C++,Java,PHP编译器)我常用
①它支持C,C++,PHP和Java编译器。OnlineGDB的独特功能是,您可以逐步调试您的代码。一旦代码被写入,它可以很容易地格式化,使其看起来不错。
9.GCC资源管理器
①GCC编译器资源管理器是一个交互式在线编译器,它显示编译后的C++、RISE、GO(以及更多)代码的汇编输出。