java - 撤消 Document.Replace 后如何防止光标移动

标签 java swing replace document undo

如果您在 Java 中有一个文本组件并且您执行了替换,则光标将不会移动,如果您使用标准撤消管理器撤消和重做该替换,则光标将移动到该插入或删除的开头或结尾。

我该如何防止这种行为?

我能够用 Java TextComponentDemo 触发它,我在其中添加了一个简单的替换操作:

doc.replace(doc.getText(0, doc.getLength()).indexOf("mouse"), 5, "cat", null);

如果我然后使用演示的撤消和重做,光标将会移动。

最佳答案

Java Swing 并不是唯一在标准撤消管理器中具有此行为的 API。有时 XUL(它是 Firefox 和 Thunderbird 的基础)对 3rd 方扩展中的文本区域做同样的事情。本质上,即使在这种情况下原始文本和替换文本相似,文本区域也必须将文档视为一个全新的文档,就像您执行了全选粘贴覆盖旧文本。一般来说,将相同的光标位置恢复到新文档是没有用的,如果文档更短,甚至可能无法实现。

我认为最简单的解决方法是创建您自己的自定义操作来替换文本。聆听它们并执行操作而不是执行默认操作。您的自定义操作应该是一个复合 操作,它手动扫描文档,替换现有文档中的子字符串 - 通过执行大量文档更改一直扫描并替换到最后。当您覆盖撤消方法时,只需浏览您所做的修改列表,以相反的顺序撤消每一项。只要复合 Action 中的每个 Action 都正确设置了文本和光标位置,并且它的撤销方法正常工作,整个复合 Action 也将正常撤销。

This guide希望应该更清楚地解释这个概念。该示例在用户键入时将操作合并到组中。您只需要执行相同的操作,但需要进行程序编辑。

关于java - 撤消 Document.Replace 后如何防止光标移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5502551/

相关文章:

replace - 人口更替

javascript - JS string.replace(regex, function) 并不贪婪

java - 如何使用getResources方法正确显示图片?

java - 在 Alfresco Explorer 中将结果导出到 Excel

java - ReplaceRange(); 的替代品是什么?在 JTextArea 中,对于 JTextPane?

java - JFileChooser:防止用户以现有名称保存文件

java - 如何在两个 JTable 之间进行更改?

java - 如何在 Chrome 下载中访问父级下角色的 (Xpath) 值

java - 为什么 BoxLayout 不允许我更改 JButton 的宽度但让我更改高度?

jQuery 搜索页面的文本并更改它,但如果它已经存在则不要更改