使用JTextPane进行DocumentEvent处理出现的问题。

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


}
}
...全文
187 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzx6169936 2008-06-22
  • 打赏
  • 举报
回复
用TextListener监听文本的变化好了
Don_Juan 2008-06-21
  • 打赏
  • 举报
回复
重写paintCompoent呢
KOOK_OKKO 2008-06-21
  • 打赏
  • 举报
回复

参考
http://blog.ccidnet.com/blog-htm-itemid-159338-uid-45279-do-showone-type-blog.html

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧