Java 关键字染色 DocumentListener死循环

wd9053 2009-10-30 05:03:44
在写一个记事本,想实现Ultraedit即时Java关键字染色的功能。
我使用的文本框是JTextPane,利用DocumentListener监听文本改变,并及时对改变的区域进行染色。
可问题是当我判断一个单词是关键字时,我得先删去这个词,然后将字体换为红色在插入原来位置。
这样会造成DocumentListener发生死循环,想请教大家是如何处理的。
(是要及时响应文本变化,而不是输完文本后按一个按钮才开始染色)
java.lang.IllegalStateException: Attempt to mutate in notification
at javax.swing.text.AbstractDocument.writeLock(Unknown Source)
at javax.swing.text.AbstractDocument.remove(Unknown Source)
at MyEditor.dealChange(MyEditor.java:215)
at MyEditor.dealChange(MyEditor.java:200)
at MyEditor.dealChange(MyEditor.java:154)
at MyEditor.access$400(MyEditor.java:36)
at MyEditor$MyDocumentListener.valueChanged(MyEditor.java:291)
at MyEditor$MyDocumentListener.insertUpdate(MyEditor.java:275)
at javax.swing.text.AbstractDocument.fireInsertUpdate(Unknown Source)
at javax.swing.text.AbstractDocument.handleInsertString(Unknown Source)
at javax.swing.text.AbstractDocument.insertString(Unknown Source)
at javax.swing.text.AbstractDocument.replace(Unknown Source)
at javax.swing.JTextPane.replaceSelection(Unknown Source)
at javax.swing.JTextPane.replaceSelection(Unknown Source)
at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerform
ed(Unknown Source)
at javax.swing.SwingUtilities.notifyAction(Unknown Source)
at javax.swing.JComponent.processKeyBinding(Unknown Source)
at javax.swing.JComponent.processKeyBindings(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)

at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Sour
ce)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Sour
ce)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
...全文
179 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wd9053 2009-10-30
  • 打赏
  • 举报
回复
可为什么removeDocumentListener不行呢?
doc.removeDocumentListener(***);
do....
doc.addDocumentListener(***);
yanhan0615 2009-10-30
  • 打赏
  • 举报
回复
没做过这个东西,大概看了下文档,楼主写的两句代码我猜测是在DocumentListener中写的,其实也就是说当文档发生变化了,会调用DocumentListener,但是在DocumentListener中,你做了remove和insertString操作,这样又引起文档变化,于是文档又通知DocumentListener,这样就死循环了。。。

看了一下,貌似怎么改都会触动到DocumentListener,于是,有个笨办法,你先试试,捕获JTextPane的addPropertyChangeListener,当属性发生改变的时候,把JTextPane中输入的String取出来,用这些String构造一个Document,然后在set到JTextPane中,我觉得这样应该是可行的。。。
wd9053 2009-10-30
  • 打赏
  • 举报
回复
什么意思?
catch(IllegalStateException e)?这样的话虽然程序能继续运行,可是文字不会被染色啊

doc.remove(start, len);//////在这一步还未完成时就会抛出异常,即使捕获,文本还是没改变啊
doc.insertString(start, word, attrSet);
littlemonster 2009-10-30
  • 打赏
  • 举报
回复
加exception没?
源码链接: https://pan.quark.cn/s/46590cc698ca 在信息技术领域,特别是在网络应用程序开发和用户界面设计方面,构建支持多选项选择的下拉选择框是一项普遍的需求。常规的下拉选择框往往仅限于让用户选择一个选项,然而,通过定制和扩展,我们能够构建一个能够支持多个选项选择的下拉选择框。以下将对这一主题进行深入探讨。 我们将探讨“支持多选项选择的下拉选择框”的构建方法。这种功能通常应用于用户需要从众多选项中进行选择,而全部选项不可能在页面上完全展示的情况。在这种情况下,一个可进行多选项选择的下拉选择框提供了一种既高效又节省空间的解决方案。描述中提到,这种多选项下拉选择框是通过一个被称为“checkboxlist”的元素构建的,这可能是使用特定的编程语言(如JavaScript、HTML5或特定的前端框架如React、Vue)中的一个组件或控件。 在网络应用程序开发中,实现此类功能通常需要以下步骤: 1. **HTML结构**:构建一个基础的下拉选择框结构,通常使用``元素的样式。 3. **JavaScript交互**:为了实现checkboxlist的效果,通常会运用JavaScript或jQuery来处理用户的交互事件,如点击、键盘操作等,同时更新选定的选项状态。 4. **自定义控件**:在某些场景下,为了获得更佳的用户体验,开发者可能会选择创建自定义的用户控...

62,620

社区成员

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

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