隐藏Swing的撤消管理器中的某些操作

Ita*_*man 5 java swing undo

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

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

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

如果我尝试阻止CHANGE事件到达撤消管理器,我会在几次撤消请求后得到异常:这是因为文档内容不符合可撤销编辑对象所期望的.

有任何想法吗?

Ala*_*ore 1

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

最终,我想您会发现 JTextPane/StyledDocument/etc 提供的样式机制。对于这种事情来说太有限了。它很慢,使用太多内存,并且它基于用于跟踪文档的词汇结构的相同元素树。(我猜)对于用户应用样式的应用程序(例如文字处理器)来说这是可以的,但对于必须在用户键入时不断更新样式的语法突出显示器来说就不行了。

有几个基于 Swing 和类的自定义实现的语法突出显示编辑器JTextComponentView示例Document。有些(例如 JEdit)几乎重新实现了整个javax.swing.text包,但我认为您不需要走那么远。