我正在实现一个包含撤消/重做堆栈的Java应用程序。我注意到有些应用程序(例如Mac OS X上的TextEdit)允许您在键入一些文本后从“编辑”菜单中选择“撤消键入”。我也想在我的应用程序中实现这种功能,但是我很难找到有关其行为方式的准则。
经过反复试验,关于TextEdit的“撤消键入”行为的最佳猜测是:
- 当用户键入一个新字符(或键入删除键)时,如果一个字符位于“撤消”堆栈的顶部,则将其合并到上一个“撤消键入”项中,除非发生以下情况之一
- 用户至少闲置15秒后继续输入内容,请务必创建新的“撤消键入”项目
- 用户长时间输入并满足某些条件后,请务必创建一个新的“撤消键入”项目(无法确定这是基于时间还是基于字符计数)。
- 选择任何文本然后删除或覆盖文本时,始终创建一个新的“撤消键入”项目(选择文本,不进行更改,然后返回到原始插入点并继续键入不会触发此操作)
在实践中,Apple的策略似乎行得通(至少在我键入时对我有效),但是正如最后一点所指出的那样,我实际上还无法弄清楚规则。另外,似乎其他程序遵循不同的规则,例如Microsoft Word。Google尚未为任何“撤消键入”实施提供明确的规则列表,而且我还没有遇到任何应如何操作的最佳实践。那么它应该如何表现呢?还是仅仅取决于程序员的想法?
编辑:只是为了澄清,我现在对实现细节不感兴趣。对于是否存在权威的参考文献(例如最佳实践或用户界面文档)进行描述或对如何在多种产品中实现的描述,我尤其感到好奇。
124<delete>3
,然后撤消和重做将导致123
。我猜这的好处是,它会导致用户最终的文本状态,有点像上面的建议。