使用JTextPane进行DocumentEvent处理出现的问题。
本人要做一个可以实现代码的关键字高亮的程序(因为要一边用键盘输入,一边判断是否为关键字,所以选择了进行DocumentEvent的监控)。但是这样出现的问题便是:无法通过setText或者insertString改变其中内容的值。(出错信息为:Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification)。网上查到:这是WriteLock所致。查了很多帖子,有的没有得到解答,有的采取键盘事件监听的方法。但是考虑到粘贴代码的情况,键盘事件监听显然是不能完全符合要求的。还有的代码是对文件中的代码进行输入,并高亮关键字。这样没有用到DocumentListener,自然也不会出现问题。总之没有找到合适的结果。请问高手有何办法解决这个问题?如果无法直接解决,对于我要实现的功能,还有什么好的办法?不胜感谢。(是采用键盘方式输入,不是文件;考虑到可能出现粘贴代码的情形,监听键盘事件也不合要求。)
抽象简化后的出错代码形式如下:
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Try extends JFrame implements DocumentListener
{
private JTextPane textPane = new JTextPane();
private StyledDocument document = (StyledDocument)textPane.getDocument();
public Try()
{
Container contentPane = getContentPane();
textPane.setFont(new Font("Dialog", Font.PLAIN, 18));
contentPane.add(new JScrollPane(textPane), BorderLayout.CENTER);
document.addDocumentListener(this);
}
public void insertUpdate(DocumentEvent e)
{
System.out.println(""+e.getOffset());
try{
document.remove(0, document.getLength());
}//此处出现异常,WriteLock所致,凡是可能改变内容的函数,都会产生此异常
catch(BadLocationException ex){}
}
public void removeUpdate(DocumentEvent e)
{
}
public void changedUpdate(DocumentEvent e)
{
}
public static void main(String args[])
{
Try wnd = new Try();
wnd.setSize(400, 400);
wnd.setVisible(true);
wnd.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
}