Undo/Redo是软件的一个常用功能,Java 在swing中提供了Undo包, 提供了对JTextComponent组件的Undo/Redo支持。但是除了文本处理以外的Undo/Redo一般要自己实现,而且即使是文本处理的Undo/Redo, 好像也有些不足,例如输入时Undo/Redo是一个一个字符的,如果要做到WORD的一次一串字符撤销/恢复,也要自己实现。最近,研究了一下Undo包, 发现它的类还是比较复杂的。那么,能用简单的方法实现自己的Undo/Redo系统吗?网上的答案一般是用Command模式, 但很难看到简单易懂的实现方式。这里,本文试图通过自己的理解实现一个简单的Undo/Redo系统。
一, Undoable和Command接口
要实现Undo/Redo功能,要实现Undoable和Command接口。
public interface Undoable {
public void undo();
public void redo();
public boolean canUndo();
public boolean canRedo();
}
public interface Command {
public void execute();
}
二, UndoableCommand抽象类
在Undoable和Command接口基础上封装一个抽象类,为了简单起见,没有让它显式implements Undoable和Command接口。
UndoableCommand类的主要功能:
封装了一个boolean 变量 canUndo, 因为一个Command只有canUndo和canRedo两种状态,当Undo和Redo的时候要完成相应boolean值的切换。
Undo后只能Redo, Redo后只能Undo, 错误的调用会抛出异常。
提供抽象方法 command()和restore(), 由子类来实现Undo/Redo的逻辑。
提供boolean方法canAppendWith(UndoableCommand other), 当一些Command需要一起Undo,Redo时由子类override
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
public abstract class UndoableCommand {
protected boolean canUndo;
protected abstract void command();
protected abstract void restore();
public void execute() {
command();
setCanUndo(true);
}
protected void unExecute() {
restore();
setCanUndo(false);
}
public void undo() {
if (!canUndo()) {
throw new CannotUndoException();
}
unExecute();
}
public void redo() {
if (!canRedo()) {
throw new CannotRedoException();
}
execute();
}
public boolean canUndo() {
return canUndo;
}
public boolean canRedo() {
return !canUndo;
}
protected void setCanUndo(boolean canUndo) {
this.canUndo = canUndo;
}
protected boolean canAppendWith(UndoableCommand other) {
return false;
}
}
分享到:
相关推荐
综上所述,本文主要围绕Java Swing框架下的Undoable功能展开,通过分析常见应用程序中Undo/Redo行为的特点,介绍了Java Swing提供的Undoable APIs以及如何使用它们来实现自己的撤销/重做功能。此外,还简要提及了...
在Java编程中,实现撤销(Undo)操作是增强应用程序用户体验的重要功能,特别是在涉及用户交互和图形编辑的应用中。Swing库提供了一套完整的框架来帮助开发者轻松实现这一特性。主要涉及的类和接口位于`javax.swing....
总结来说,撤消重做堆栈是通过维护操作历史来实现的一种功能,它使用备忘录设计模式,通常包含两个堆栈来分别存储撤销和重做操作。这种机制在软件开发中广泛应用,极大地提升了用户体验。在实际编程中,开发者需要...
重新执行撤消/重做功能。 在99保全权范围内发生的类似行为。 实物保全合同的一部分。 Estées elcódigodel Mastermind con latécnicadel doble despacho,Sobre el que agregaremos los patrones y funcionalida...
在Qt框架中,撤销恢复功能是通过QUndoStack、QCommand和QUndoGroup类来实现的,这些类提供了强大的机制,使得用户可以在应用程序中轻松地实现撤销和恢复操作。本例子详细展示了如何在Qt项目中集成撤销恢复功能,特别...
* 它可以实现 Undo/Redo 操作,例如文本编辑器的撤销和重做操作。 * 它可以用于游戏存档、数据库rollback 等场景。 备忘录模式的缺点 虽然备忘录模式非常有用,但它也有一些缺点,例如: * 它可能会增加系统的...
这样,调用者可以调用`undo()`来恢复前一次的执行状态。 7. **UML类图**: 在UML设计类图中,通常会包含如下元素:`Command`接口、具体命令类(如`LightOnCommand`和`LightOffCommand`)、接收者类(如`Light`)、...
这一功能通常基于undo/redo堆栈,每次编辑操作都会在堆栈上留下一个状态,用户可以通过撤销和重做命令在这些状态之间切换。 最后,文本查找功能让开发者能够快速搜索代码中的特定字符串或模式。这个功能通常支持...
在Java编程中,实现记事本的撤销功能是一项常见的任务,它涉及到文本编辑器的核心功能。撤销功能允许用户取消最近的操作,恢复到之前的状态。在本文中,我们将深入探讨如何在Java中构建这样的功能,主要关注`frame`...
此外,可能还需要提供一个`redo()`方法来恢复撤销的操作。对于更复杂的功能,如连续操作或表达式解析,可能需要使用更高级的数据结构和算法。 这个简单的有撤销功能的Java计算器展示了如何利用面向对象编程、数据...
5. ** undo/redo机制**:了解如何实现撤销/重做功能,这通常通过维护一个操作栈来实现,每次用户执行操作都将其压栈,撤销时从栈顶弹出并回滚。 6. 图像处理:如果记事本支持图片,可能涉及到对图像文件的读取和...
此外,我们还需要考虑其他常见的文本编辑功能,如撤销/重做(Undo/Redo)、查找/替换(Find/Replace)等。这些功能可以通过维护一个操作历史栈,每次进行编辑操作时,都将旧状态压入栈中。当用户触发撤销或重做时,...
9. **Undo/Redo功能**: 写字板通常会有撤销/重做功能,这需要实现自己的命令设计模式,记录用户的每一个编辑操作,以便在需要时恢复或重复。 10. **事件调度线程(Event Dispatch Thread, EDT)**: Java GUI的更新...
对于撤销/重做,Java的AbstractDocument类支持基于undo/redo的操作,可以记录用户的编辑历史。 在代码组织上,遵循面向对象的原则,可能会有独立的类来处理特定的功能,比如TextEditor类负责文本编辑,MenuHandler...
在Java编程语言中,创建一个简单的记事本应用...这个Java记事本程序通过整合上述技术,提供了一个基本的文本编辑环境,包括文件操作、编辑功能(如剪切、复制、粘贴、删除、全选等)、撤销/重做以及自定义的界面外观。
你可以使用EditPlus来完全替代Windows的记事本,因为EditPlus不仅拥有记事本的所有功能,而且还拥有无限制的 Undo/Redo、英文拼字检查、自动换行、列数标记、搜索替代、同时编辑多文件、全屏幕浏览等更加完善的功能...
此外,系统可能还需要实现 undo/redo 功能,以便用户可以撤销或重做这些操作,这就需要用到设计模式,如命令模式来记录用户的操作历史。 删除功能相对简单,主要涉及文件操作。Java的File类提供了删除文件的方法,...
4. **撤销与重做**:通过实现undo/redo机制,用户可以方便地撤销或恢复误操作。 5. **剪切、复制和粘贴**:遵循标准的剪贴板操作,方便用户在不同位置之间移动或复制文本。 6. **自动换行**:根据文本长度自动进行...
3. **便于实现 undo/redo 操作**:通过维护一个命令的历史记录,可以轻松实现操作的撤销和重做。 4. **便于实现并发控制**:可以将命令放入队列中,实现异步处理。 命令模式的缺点: 1. **过多的命令类**:如果系统...
Simple Undo库是一个轻量级的解决方案,用于在Java应用程序中实现撤销/重做功能。这个压缩包文件"use-simple-undo-源码.rar"包含的就是Simple Undo库的源代码,通过分析这些源码,我们可以深入理解其工作原理和使用...