java - 对 Swing 的撤消管理器隐藏某些操作

标签 java swing undo

我正在尝试编写一个支持某种着色的 JTextPane:当用户键入文本时,我正在运行一些根据特定算法为文本着色的代码。这很好用。

问题是着色操作已注册到撤消管理器(带有 EventType.CHANGE 的 DefaultDocumentEvent)。因此,当用户单击撤消时,着色就会消失。只有在第二次撤消请求时,文本本身才会回滚。

(请注意,着色算法有点慢,因此我无法在插入文本时对其进行着色)。

如果我试图阻止 CHANGE 事件到达撤消管理器,我会在多次撤消请求后收到异常:这是因为文档内容不符合撤消编辑对象的预期。

有什么想法吗?

最佳答案

您可以拦截 CHANGE 编辑并将每个编辑包装在另一个 UndoableEdit 中,该编辑的 isSignificant() 方法返回 false,然后再将其添加到 UndoManager。然后每个撤消命令将撤消最近的 INSERT 或 REMOVE 编辑,以及此后发生的每个 CHANGE 编辑。

最终,我想您会发现 JTextPane/StyledDocument/等提供的样式机制。对于这种东西来说太有限了。它很慢,占用太多内存,而且它基于用于跟踪文档词法结构的同一 Element 树。对于用户应用样式的应用程序(如文字处理器)来说,这没问题(我猜),但对于必须在用户键入时不断更新样式的语法高亮器来说则不然。

有几个基于 Swing JTextComponentViewDocument 类自定义实现的语法高亮编辑器示例。有些,例如 JEdit,实际上重新实现了整个 javax.swing.text 包,但我认为您不需要走那么远。

关于java - 对 Swing 的撤消管理器隐藏某些操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/417480/

相关文章:

java - 为什么我的 JPanel 没有显示在 JFrame 上?

java - 如何使用 Java 使用 ImageMagick 对一批文件实现 .psd 到 .jpg 转换

c# - 如何在不对程序进行重大更改的情况下实现撤消/重做操作

java - Netbeans 错误 : Exception starting filter struts2 ClassNotFoundException: org. apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

java - Java 中的发布/转义和封装

java - 为什么ThreadLocal不在新线程中创建?

Java Netbeans 8.0 Jframe GUI 程序 - arraylist 中的每个索引值未显示在 jtextArea 中的单独行上

c++ - 如何在 C++ 中创建 "undo"?

winapi - win32api 使用 SHFileStruct 从回收站还原文件

java - JSF2 AJAX h :selectOneMenu listener doesn't call