快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

备忘录编辑器java代码,用java实现简易备忘录

用JAVA编写一个图形应用程序,可以是一个简单的文本编辑器、计算器等等。 求完整代码

//百度文库找的,可费了我的财富值了,你可要把分给我呀。

十多年的望城网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整望城建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“望城网站设计”,“望城网站推广”以来,每个客户项目都认真落实执行。

package lee;

/*文件名:Calculator.java

*说明:简易科学计算器

*/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class Calculator extends Frame implements ActionListener, WindowListener

{

private Container container;

private GridBagLayout layout;

private GridBagConstraints constraints;

private JTextField displayField; //计算结果显示区

private String lastCommand; //保存+,-,*,/,=命令0

private double result; //保存计算结果

private boolean start; //判断是否为数字的开始

private JMenuBar menubar;

private JMenuItem m_exit,m2_ejz,m2_bjz;

private Dialog dialog;

private Label label_dialog;

private JButton button_sqrt,button_plusminus,button_CE,button_cancel,button_1,button_2,

button_3,button_4,button_5,button_6,button_7,button_8,button_9,button_0,

button_plus,button_minus,button_multiply,button_divide,button_point,

button_equal,button_log,button_tan,button_cos,button_sin,button_exp;

public Calculator() //构造方法设置布局、为按钮注册事件监听器

{

super("Calculator");

this.setLocation(240,200);

this.setSize(350,300);

this.setResizable(true);

this.setLayout(new GridLayout(7,1));

this.addmyMenu(); //调用成员方法添加菜单

displayField=new JTextField(30);

this.add(displayField);

displayField.setEditable(true);

start=true;

result=0;

lastCommand = "=";

JPanel panel0=new JPanel();

panel0.setLayout(new GridLayout(1,4,4,4));

JPanel panel1=new JPanel();

panel1.setLayout(new GridLayout(1,5,4,4));

this.add(panel1);

button_sqrt=new JButton("sqrt");

button_plusminus=new JButton("+/-");

button_exp=new JButton("exp");

button_CE=new JButton("退格");

button_cancel=new JButton("C");

JPanel panel2=new JPanel();

panel2.setLayout(new GridLayout(1,5,4,4));

this.add(panel2);

button_7=new JButton("7");

button_8=new JButton("8");

button_9=new JButton("9");

button_log=new JButton("log");

button_divide=new JButton("/");

JPanel panel3=new JPanel();

panel3.setLayout(new GridLayout(1,5,4,4));

this.add(panel3);

button_4=new JButton("4");

button_5=new JButton("5");

button_6=new JButton("6");

button_tan=new JButton("tan");

button_multiply=new JButton("*");

JPanel panel4=new JPanel();

panel4.setLayout(new GridLayout(1,5,4,4));

this.add(panel4);

button_1=new JButton("1");

button_2=new JButton("2");

button_3=new JButton("3");

button_cos=new JButton("cos");

button_minus=new JButton("-");

JPanel panel5=new JPanel();

panel5.setLayout(new GridLayout(1,5,4,4));

this.add(panel5);

button_0=new JButton("0");

button_point=new JButton(".");

button_equal=new JButton("=");

button_sin=new JButton("sin");

button_plus=new JButton("+");

panel1.add(button_sqrt);

panel1.add(button_plusminus);

panel1.add(button_exp);

panel1.add(button_CE);

panel1.add(button_cancel);

panel2.add(button_7);

panel2.add(button_8);

panel2.add(button_9);

panel2.add(button_log);

panel2.add(button_divide);

panel3.add(button_4);

panel3.add(button_5);

panel3.add(button_6);

panel3.add(button_tan);

panel3.add(button_multiply);

panel4.add(button_1);

panel4.add(button_2);

panel4.add(button_3);

panel4.add(button_cos);

panel4.add(button_minus);

panel5.add(button_0);

panel5.add(button_point);

panel5.add(button_equal);

panel5.add(button_sin);

panel5.add(button_plus);

button_sqrt.addActionListener(this);

button_plusminus.addActionListener(this);

button_exp.addActionListener(this);

button_CE.addActionListener(this);

button_cancel.addActionListener(this);

button_7.addActionListener(this);

button_8.addActionListener(this);

button_9.addActionListener(this);

button_log.addActionListener(this);

button_divide.addActionListener(this);

button_4.addActionListener(this);

button_5.addActionListener(this);

button_6.addActionListener(this);

button_tan.addActionListener(this);

button_multiply.addActionListener(this);

button_1.addActionListener(this);

button_2.addActionListener(this);

button_3.addActionListener(this);

button_cos.addActionListener(this);

button_minus.addActionListener(this);

button_0.addActionListener(this);

button_point.addActionListener(this);

button_equal.addActionListener(this);

button_sin.addActionListener(this);

button_plus.addActionListener(this);

this.addWindowListener(new WinClose()); //注册窗口监听器

this.setVisible(true);

}

private void addmyMenu() //菜单的添加

{

JMenuBar menubar=new JMenuBar();

this.add(menubar);

JMenu m1=new JMenu("选项");

JMenu m2=new JMenu("进制转换");

JMenuItem m1_exit=new JMenuItem("退出");

m1_exit.addActionListener(this);

JMenuItem m2_ejz=new JMenuItem("二进制");

m2_ejz.addActionListener(this);

JMenuItem m2_bjz=new JMenuItem("八进制");

m2_bjz.addActionListener(this);

JMenu m3 = new JMenu(" 帮助");

JMenuItem m3_Help = new JMenuItem("用法");

m3_Help.addActionListener(this);

dialog = new Dialog(this,"提示",true); //模式窗口

dialog.setSize(240,80);

label_dialog = new Label("",Label.CENTER); //标签的字符串为空,居中对齐

dialog.add(label_dialog);

dialog.addWindowListener(this); //为对话框注册窗口事件监听器

m1.add(m1_exit);

menubar.add(m1);

m2.add(m2_ejz);

m2.add(m2_bjz);

menubar.add(m2);

m3.add(m3_Help);

menubar.add(m3); }

public void actionPerformed(ActionEvent e) //按钮的单击事件处理方法

{

if(e.getSource().equals(button_1)||e.getSource().equals(button_2)||

e.getSource().equals(button_3)||e.getSource().equals(button_4)||

e.getSource().equals(button_5)|| e.getSource().equals(button_6)||

e.getSource().equals(button_7)|| e.getSource().equals(button_8)||

e.getSource().equals(button_9) ||e.getSource().equals(button_0)||

e.getSource().equals(button_point)||e.getSource().equals(button_plusminus)||

e.getSource().equals(button_cancel)||e.getSource().equals(button_CE))

{ //非运算符的处理方法

String input=e.getActionCommand();

if (start)

{

displayField.setText("");

start=false;

if(input.equals("+/-"))

displayField.setText(displayField.getText()+"-");

}

if(!input.equals("+/-"))

{

String str=displayField.getText();

if(input.equals("退格")) //退格键的实现方法

{

if(str.length()0)

displayField.setText(str.substring(0,str.length()-1));

}

else if(input.equals("C")) //清零键的实现方法

{

displayField.setText("0");

start=true;

}

else

displayField.setText(displayField.getText()+input);

}

}

else if (e.getActionCommand()=="二进制") //二进制的转换

{

int n=Integer.parseInt(displayField.getText());

displayField.setText(Integer.toBinaryString(n));

}

else if (e.getActionCommand()=="八进制") //八进制的转换

{

int n=Integer.parseInt(displayField.getText());

displayField.setText(Integer.toOctalString(n));

}

else if (e.getActionCommand()=="退出") //选项中退出的处理方法

{

System.exit(0);

}

else if (e.getActionCommand()=="用法") //按下'帮助'菜单栏中用法的处理方法

{

label_dialog.setText("sqrt,exp等键是先输运算符再输数字\n");

dialog.setLocation(400,250);

dialog.setVisible(true);

}

else //各运算符的识别

{

String command=e.getActionCommand();

if(start)

{

lastCommand=command;

}

else

{

calculate(Double.parseDouble(displayField.getText()));

lastCommand=command;

start=true;

}

}

}

public void calculate(double x) //各运算符的具体运算方法

{

double d=0;

if (lastCommand.equals("+"))

result+= x;

else if (lastCommand.equals("-"))

result-=x;

else if (lastCommand.equals("*"))

result*=x;

else if (lastCommand.equals("/"))

result/=x;

else if (lastCommand.equals("="))

result=x;

else if (lastCommand.equals("sqrt"))

{

d=Math.sqrt(x);

result=d;

}

else if (lastCommand.equals("exp"))

{

d=Math.exp(x);

result=d;

}

else if (lastCommand.equals("log"))

{

d=Math.log(x);

result=d;

}

else if (lastCommand.equals("tan"))

{

d=Math.tan(x);

result=d;

}

else if (lastCommand.equals("cos"))

{

d=Math.cos(x);

result=d;

}

else if (lastCommand.equals("sin"))

{

d=Math.sin(x);

result=d;

}

displayField.setText(""+ result);

}

public void windowClosing(WindowEvent e)

{

if(e.getSource()==dialog)

dialog.setVisible(false); //隐藏对话框

else

System.exit(0);

}

public void windowOpened(WindowEvent e) { }

public void windowActivated(WindowEvent e) { }

public void windowDeactivated(WindowEvent e) { }

public void windowClosed(WindowEvent e) { }

public void windowIconified(WindowEvent e) { }

public void windowDeiconified(WindowEvent e) { }

public static void main(String args[])

{

Calculator calculator=new Calculator();

}

}

class WinClose implements WindowListener

{

public void windowClosing(WindowEvent e) //单击窗口关闭按钮时触发并执行实现窗口监听器接口中的方法

{

System.exit(0); //结束程序运行

}

public void windowOpened(WindowEvent e){}

public void windowActivated(WindowEvent e){}

public void windowDeactivated(WindowEvent e){}

public void windowClosed(WindowEvent e){}

public void windowIconified(WindowEvent e){}

public void windowDeiconified(WindowEvent e){}

}

如何用java编写一个简单的文本编辑器?

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.io.*;

public class f1 extends Frame implements ActionListener

{

private MenuBar menubar=new MenuBar();

private Menu filemenu=new Menu("文件");

private Menu editmenu=new Menu("编辑");

private Menu formmenu=new Menu("格式");

private MenuItem[] itemf=new MenuItem[4];

private MenuItem[] iteme=new MenuItem[6];

private MenuItem[] items=new MenuItem[2];

private TextArea tf=new TextArea();

public int a=0,b=0,c=0,style=Font.PLAIN,size=15;

public String s1="red:"+a+" "+"green:"+b+" "+"blue"+c,

s2="宋体";

public String[] sz1={"10","16","24","30","32","36"},

sz2={"宋体","黑体","幼圆","隶书","行楷","Arial","Georgia"},

sz3={"粗体","倾斜","常规","粗斜"};

JDialog dialog=new JDialog(this,"字体",true);

Container cp=dialog.getContentPane();

JLabel[] lb=new JLabel[8];

JLabel lb1=new JLabel(s1,JLabel.LEFT);

JButton b1=new JButton("确定"),

b2=new JButton("取消");

JComboBox jc1=new JComboBox(),

jc2=new JComboBox(),

jc3=new JComboBox();

JScrollBar jb1=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);

JScrollBar jb2=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);

JScrollBar jb3=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);

java编译的简易备忘录.

1.确定数格式,编写记录类

Record{

//记录编号

private int id;

//提醒时间

private Time t;

//提醒信息

private String info;

}

2.确定数据访问方式,可以通过文件也可以通过数据库。

写一个数据访问类,例如用文件的形式

DataAccesser{

private static syncronized File file;

//构造函数,进行file初始化

public static DataAccesser(){

}

//写入记录

public static void write(Record){

}

//根据时间读取记录

public static Record read(int id){

}

//根据时间读取记录集

public static ListRecord readSet(Time t){

}

}

3.定义存取信息队列的类

class MessageQueue{

//保存当前时刻以后的所有信息的时间队列,安顺序

private syncronized static ListTime;

//插入队列

public static void put(){

//需要按时间顺序插入

}

//获得当前时间前的时间集

public static ListTime get(){

//获得后需要将得到的时间从列表中删除

}

}

4.编写提醒类,用于提醒

class Reminder{

public void run(){

ListTime tl=getCurrentTime();

//查询出所有

需要提醒的记录调用remind()方法进行提醒

}

//提醒

protected void remind(Record r){

//这里写如何提醒

}

//获得当前时间

protected Time getCurrentTime(){

}

}

5.定时器类,

//提醒的主运行类

class Main{

static Thread thread;

public Main(){

thread=new Thread(){

public void run(){

while(true){

new Reminder().run();

try{

Thread.sleep(60000);

}catch(Exception e ){}

}

}

}

public static void start(){

thread.start();

}

public sattic void stop(){

thread.stop();

}

}

}

只是个框架,具体代码自己完成吧,可以查询相关的API。

java用什么软件编写代码

JAVA编程常用的软件:

1、Eclipse:

Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。

2、MyEclipse:

MyEclipse是Eclipse的升级版,也是一款功能强大的J2EE集成开发环境,由Genuitec公司发布,提供免费版和收费版。被誉为最好用的Java IDE之一。

MyEclipse 是对Eclipse IDE的扩展,利用它可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。

3、IntelliJ IDEA:

IntelliJ IDEA是一款综合的Java 编程环境,被许多开发人员和行业专家誉为市场上最好用的IDE之一,与MyEclipse齐名。

它提供了一系列最实用的的工具组合:智能编码辅助和自动控制,支持J2EE,Ant,JUnit和CVS集成,非平行的编码检查和创新的GUI设计器。

4、NetBeans:

NetBeans IDE是一个屡获殊荣的集成开发环境,可以方便的在Windows、Mac、Linux和Solaris中运行。NetBeans包括开源的开发环境和应用平台,NetBeans IDE可以使开发人员利用Java平台能够快速创建Web、企业、桌面以及移动的应用程序。

5、BlueJ:

BlueJ是一款支持Java编程语言的集成开发环境(IDE)。它原本是为了教育目的而开发的,同时也适合于那些想做小型软件开发的开发人员。它的运行需要JDK(Java开发工具包)的帮助。BlueJ主要是为面向对象的程序设计教学而开发的,因此它的设计不同于其他的开发环境。

参考资料来源:百度百科-BlueJ

参考资料来源:百度百科-IntelliJ IDEA

参考资料来源:百度百科-Netbeans

参考资料来源:百度百科-eclipse

参考资料来源:百度百科-MyEclipse

java源代码编辑器 设计用于编写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 SetString keywords;

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 HashSetString();

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(), 返回的是一个文档的结束符, 不会抛出异常. 如果pos0, 则会抛出异常.

* 所以pos的有效值是[0, doc.getLength()]

*

* @param doc

* @param pos

* @return

* @throws BadLocationException

*/

public char getCharAt(Document doc, int pos) throws BadLocationException {

return doc.getText(pos, 1).charAt(0);

}

/**

* 取得下标为pos时, 它所在的单词开始的下标. ±wor^d± (^表示pos, ±表示开始或结束的下标)

*

* @param doc

* @param pos

* @return

* @throws BadLocationException

*/

public int indexOfWordStart(Document doc, int pos) throws BadLocationException {

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

for (; pos 0 isWordCharacter(doc, pos - 1); --pos);

return pos;

}

/**

* 取得下标为pos时, 它所在的单词结束的下标. ±wor^d± (^表示pos, ±表示开始或结束的下标)

*

* @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) {}

}

}

}


网站栏目:备忘录编辑器java代码,用java实现简易备忘录
网页地址:http://6mz.cn/article/dsegped.html

其他资讯