本人要做一个可以实现代码的关键字高亮的程序(因为要一边用键盘输入,一边判断是否为关键字,所以选择了进行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);
        
        
    }
}