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)
...全文
178 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没?
内容概要:本文档为鹏鼎EES项目第二阶段关于设备闲置与富余识别的需求设计方案,旨在通过自动化方式识别低利用率设备,减少资产浪费。系统基于OEE系统提供的设备近6个月时间稼动率数据,设定“闲置”(连续6个月稼动率为0%)和“富余”(6个月平均稼动率≤30%)的判断标准,每周一自动执行识别任务并生成记录。支持在系统中查看识别结果列表、筛选导出数据、发起闲置申请及删除记录(管理员权限)。同时,系统通过鼎加机器人按设备闲置/富余持续时长(7天、30天、90天、180天)逐级向上推送预警消息至维护人员、厂长、处长、经管等层级,推动问题处理。此外,若设备被判定为闲置但未提交闲置申请,系统将向维护人员和设备课长发送D+提醒。; 适合人群:系统设计人员、开发人员、测试人员、设备管理人员及项目实施相关人员;尤其适用于熟悉OEE系统、设备管理流程及企业信息化系统的专业人员;; 使用场景及目标:① 实现设备利用率的动态监控与闲置风险预警;② 支持企业优化设备资源配置,降低资产闲置成本;③ 推动设备闲置处理流程自动化与责任到人机制建立;④ 为后续设备处置、调配、报废等决策提供数据支撑;; 阅读建议:本文档为研发与实施阶段的核心指导文件,涉及系统逻辑、数据来源、权限控制与集成接口等关键内容,建议结合OEE数据对接情况、企业组织架构与设备管理流程协同研读,并关注阈值配置、提醒机制与状态联动等可配置项的实际业务适配性。

62,621

社区成员

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

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