根据以下的设计要求编写源代码。java

一、根据以下的设计要求编写源代码。java

class Student{ private String name; private int age; public Student(){ this.name = “nobody”; this.age =20; } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; } public boolean isSameAge(Student s){ return age == s.age; } }

根据以下的设计要求编写源代码。java

二、根据以下的设计要求编写源代码。java

class Student{ private String name; private int age; public Student(){ **.name = “nobody”; this.age =20; } public void setName(String name){ **.name = name; } public Strine(){ return name; } public void setAge(i this.age = a } public int getAge(){ return age; } public boolean isStudent s){ return age == s.age; } }

三、根据以下的设计要求编写源代码.java

一. 高亮的内容: 需要高亮的内容有: 1. 关键字, 如 public, int, true 等. 2. 运算符, 如 +, -, *, /等 3. 数字 4. 高亮字符串, 如 “example of string” 5. 高亮单行注释 6. 高亮多行注释 二. 实现高亮的核心方法: styleddocument.setcharacterattributes(int offset, int length, attributeset s, boolean replace) 三. 文本编辑器选择. java中提供的多行文本编辑器有: jtextcomponent, jtextarea, jtextpane, jeditorpane等, 都可以使用. 但是因为语法着色中文本要使用多种风格的样式, 所以这些文本编辑器的document要使用styleddocument. jtextarea使用的是plaindocument, 此document不能进行多种格式的着色. jtextpane, jeditorpane使用的是styleddocument, 默认就可以使用. 为了实现语法着色, 可以继承自defaultstyleddocument, 设置其为这些文本编辑器的documet, 或者也可以直接使用jtextpane, jeditorpane来做. 为了方便, 这里就直接使用jtextpane了. 四. 何时进行着色. 当文本编辑器中有字符被插入或者删除时, 文本的内容就发生了变化, 这时检查, 进行着色. 为了监视到文本的内容发生了变化, 要给document添加一个documentlistener监听器, 在他的removeupdate和insertupdate中进行着色处理. 而changedupdate方法在文本的属性例如前景色, 背景色, 字体等风格改变时才会被调用. @override public void changedupdate(documentevent e) { } @override public void insertupdate(documentevent e) { try { colouring((styleddocument) e.getdocument(), e.getoffset(), e.getlength()); } catch (badlocationexception e1) { e1.printstacktrace(); } } @override public void removeupdate(documentevent e) { try { // 因为删除后光标紧接着影响的单词两边, 所以长度就不需要了 colouring((styleddocument) e.getdocument(), e.getoffset(), 0); } catch (badlocationexception e1) { e1.printstacktrace(); } } 五. 着色范围: pos: 指变化前光标的位置. len: 指变化的字符数. 例如有关键字public, int 单词”publicint”, 在”public”和”int”中插入一个空格后变成”public int”, 一个单词变成了两个, 这时对”public” 和 “int”进行着色. 着色范围是public中p的位置和int中t的位置加1, 即是pos前面单词开始的下标和pos+len开始单词结束的下标. 所以上例中要着色的范围是”public int”. 提供了方法indexofwordstart来取得pos前单词开始的下标, 方法indexofwordend来取得pos后单词结束的下标. public int indexofwordstart(document doc, int pos) throws badlocationexception { // 从pos开始向前找到第一个非单词字符. for (; pos > 0 && iswordcharacter(doc, pos - 1); –pos); return 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); // 取得在文档中pos位置处的字符 if (character.isletter(ch) || character.isdigit(ch) || ch == ‘’) { return true; } return false; } 所以着色的范围是[start, end] : int start = indexofwordstart(doc, pos); int end = indexofwordend(doc, pos + len); 六. 关键字着色. 从着色范围的开始下标起进行判断, 如果是以字母开或者下划线开头, 则说明是单词, 那么先取得这个单词, 如果这个单词是关键字, 就进行关键字着色, 如果不是, 就进行普通的着色. 着色完这个单词后, 继续后面的着色处理. 已经着色过的字符, 就不再进行着色了. 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, pos, wordend - pos, 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; } 因为在insertupdate和removeupdate方法中不能修改document的属性, 所以着色的任务放到这两个方法外面, 所以使用了swingutilities.invokelater来实现. private class colouringtask implements runnable { private styleddocument doc; private 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() { try { // 这里就是对字符进行着色 doc.setcharacterattributes(pos, len, style, true); } catch (exception e) {} } } 七: 源码 关键字着色的完成代码如下, 可以直接编译运行. 对于数字, 运算符, 字符串等的着色处理在以后的教程中会继续进行详解. import java.awt.color; import java.util.hashset; import java.util.set; 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; public class highlightkeywordsdemo { public static void main(string[] args) { jframe frame = new jframe(); jtextpane editor = new jtextpane(); editor.getdocument().adddocumentlistener(new syntaxhighlighter(editor)); frame.getcontentpane().add(editor); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(500, 500); frame.setvisible(true); } } /** * 当文本输入区的有字符插入或者删除时, 进行高亮. * * 要进行语法高亮, 文本输入组件的document要是styled document才行. 所以不要用jtextarea. 可以使用jtextpane. * * @author biao * */ class syntaxhighlighter implements documentlistener { private setkeywords; private style keywordstyle; 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.setforeground(normalstyle, color.black); // 准备关键字 keywords = new hashset(); keywords.add(“public”); keywords.add(“protected”); keywords.add(“private”); keywords.add(”int9”); keywords.add(“float”); keywords.add(“double”); } 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; } } } /** * 对单词进行着色, 并返回单词结束的下标. * * @param doc * @param pos * @return * @throws badlocationexception */ 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时, 它所在的单词结束的下标. a±wor^da± (^表示pos, a±表示开始或结束的下标) * * @param doc * @param pos * @return * @throws badlocationexception */ public int indexofwordend(document doc, int pos) throws badlocationexception { // 从pos开始向前找到第一个非单词字符. for (; iswordcharacter(doc, pos); ++pos); return pos; } /** * 如果一个字符是字母, 数字, 下划线, 则返回true. * * @param doc * @param pos * @return * @throws badlocationexception */ public boolean iswordcharacter(document doc, int pos) throws badlocationexception { char ch = getcharat(doc, pos); if (character.isletter(ch) || character.isdigit(ch) || ch == ‘_’) { return true; } return false; } @override public void changedupdate(documentevent e) { } @override public void insertupdate(documentevent e) { try { colouring((styleddocument) e.getdocument(), e.getoffset(), e.getlength()); } catch (badlocationexception e1) { e1.printstacktrace(); } } @override public void removeupdate(documentevent e) { try { // 因为删除后光标紧接着影响的单词两边, 所以长度就不需要了 colouring((styleddocument) e.getdocument(), e.getoffset(), 0); } catch (badlocationexception e1) { e1.printstacktrace(); } } /** * 完成着色任务 * * @author biao * */ private class colouringtask implements runnable { private styleddocument doc; private 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() { try { // 这里就是对字符进行着色 doc.setcharacterattributes(pos, len, style, true); } catch (exception e) {} } } }

本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。