我正在尝试编写一个支持某种着色的 JTextPane:当用户键入文本时,我正在运行一些根据特定算法为文本着色的代码。这很好用。
问题是着色操作已注册到撤消管理器(带有 EventType.CHANGE 的 DefaultDocumentEvent)。因此,当用户单击撤消时,着色就会消失。只有在第二次撤消请求时,文本本身才会回滚。
(请注意,着色算法有点慢,因此我无法在插入文本时对其进行着色)。
如果我试图阻止 CHANGE 事件到达撤消管理器,我会在多次撤消请求后收到异常:这是因为文档内容不符合撤消编辑对象的预期。
有什么想法吗?
最佳答案
您可以拦截 CHANGE 编辑并将每个编辑包装在另一个 UndoableEdit 中,该编辑的 isSignificant()
方法返回 false
,然后再将其添加到 UndoManager。然后每个撤消命令将撤消最近的 INSERT 或 REMOVE 编辑,以及此后发生的每个 CHANGE 编辑。
最终,我想您会发现 JTextPane/StyledDocument/等提供的样式机制。对于这种东西来说太有限了。它很慢,占用太多内存,而且它基于用于跟踪文档词法结构的同一 Element 树。对于用户应用样式的应用程序(如文字处理器)来说,这没问题(我猜),但对于必须在用户键入时不断更新样式的语法高亮器来说则不然。
有几个基于 Swing JTextComponent
、View
和 Document
类自定义实现的语法高亮编辑器示例。有些,例如 JEdit,实际上重新实现了整个 javax.swing.text
包,但我认为您不需要走那么远。
关于java - 对 Swing 的撤消管理器隐藏某些操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/417480/