`
saga_java
  • 浏览: 14896 次
  • 性别: Icon_minigender_1
  • 来自: Georgia
社区版块
存档分类

JAVA 实现Undo/Redo(撤销/恢复)一

 
阅读更多
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;
    }
}
0
2
分享到:
评论

相关推荐

    设计模式Java-侯捷

    综上所述,本文主要围绕Java Swing框架下的Undoable功能展开,通过分析常见应用程序中Undo/Redo行为的特点,介绍了Java Swing提供的Undoable APIs以及如何使用它们来实现自己的撤销/重做功能。此外,还简要提及了...

    java如何在绘图板上实现undo(撤销操作).docx

    在Java编程中,实现撤销(Undo)操作是增强应用程序用户体验的重要功能,特别是在涉及用户交互和图形编辑的应用中。Swing库提供了一套完整的框架来帮助开发者轻松实现这一特性。主要涉及的类和接口位于`javax.swing....

    undo-redo-stack:撤消重做堆栈

    总结来说,撤消重做堆栈是通过维护操作历史来实现的一种功能,它使用备忘录设计模式,通常包含两个堆栈来分别存储撤销和重做操作。这种机制在软件开发中广泛应用,极大地提升了用户体验。在实际编程中,开发者需要...

    patrones-mastermind-undo-redo-kiarras:patrones-mastermind-undo-redo-kiarras由GitHub Classroom创建

    重新执行撤消/重做功能。 在99保全权范围内发生的类似行为。 实物保全合同的一部分。 Estées elcódigodel Mastermind con latécnicadel doble despacho,Sobre el que agregaremos los patrones y funcionalida...

    备忘录模式笔记1

    * 它可以实现 Undo/Redo 操作,例如文本编辑器的撤销和重做操作。 * 它可以用于游戏存档、数据库rollback 等场景。 备忘录模式的缺点 虽然备忘录模式非常有用,但它也有一些缺点,例如: * 它可能会增加系统的...

    设计模式之命令模式Java实现

    这样,调用者可以调用`undo()`来恢复前一次的执行状态。 7. **UML类图**: 在UML设计类图中,通常会包含如下元素:`Command`接口、具体命令类(如`LightOnCommand`和`LightOffCommand`)、接收者类(如`Light`)、...

    java-Editor.zip_java editor_括号匹配 的JAVA 实现

    这一功能通常基于undo/redo堆栈,每次编辑操作都会在堆栈上留下一个状态,用户可以通过撤销和重做命令在这些状态之间切换。 最后,文本查找功能让开发者能够快速搜索代码中的特定字符串或模式。这个功能通常支持...

    java编写记事本的撤销功能

    在Java编程中,实现记事本的撤销功能是一项常见的任务,它涉及到文本编辑器的核心功能。撤销功能允许用户取消最近的操作,恢复到之前的状态。在本文中,我们将深入探讨如何在Java中构建这样的功能,主要关注`frame`...

    有撤销功能的计算器(java)

    此外,可能还需要提供一个`redo()`方法来恢复撤销的操作。对于更复杂的功能,如连续操作或表达式解析,可能需要使用更高级的数据结构和算法。 这个简单的有撤销功能的Java计算器展示了如何利用面向对象编程、数据...

    附源码JAVA记事本

    5. ** undo/redo机制**:了解如何实现撤销/重做功能,这通常通过维护一个操作栈来实现,每次用户执行操作都将其压栈,撤销时从栈顶弹出并回滚。 6. 图像处理:如果记事本支持图片,可能涉及到对图像文件的读取和...

    java记事本设计与实现(仿照window提供的记事本软件)

    此外,我们还需要考虑其他常见的文本编辑功能,如撤销/重做(Undo/Redo)、查找/替换(Find/Replace)等。这些功能可以通过维护一个操作历史栈,每次进行编辑操作时,都将旧状态压入栈中。当用户触发撤销或重做时,...

    java swimg 实现的写字板

    9. **Undo/Redo功能**: 写字板通常会有撤销/重做功能,这需要实现自己的命令设计模式,记录用户的每一个编辑操作,以便在需要时恢复或重复。 10. **事件调度线程(Event Dispatch Thread, EDT)**: Java GUI的更新...

    java做的典型小记事本

    对于撤销/重做,Java的AbstractDocument类支持基于undo/redo的操作,可以记录用户的编辑历史。 在代码组织上,遵循面向对象的原则,可能会有独立的类来处理特定的功能,比如TextEditor类负责文本编辑,MenuHandler...

    java实现记事本[参考].pdf

    在Java编程语言中,创建一个简单的记事本应用...这个Java记事本程序通过整合上述技术,提供了一个基本的文本编辑环境,包括文件操作、编辑功能(如剪切、复制、粘贴、删除、全选等)、撤销/重做以及自定义的界面外观。

    EditPlus 3.3 简体中文

    你可以使用EditPlus来完全替代Windows的记事本,因为EditPlus不仅拥有记事本的所有功能,而且还拥有无限制的 Undo/Redo、英文拼字检查、自动换行、列数标记、搜索替代、同时编辑多文件、全屏幕浏览等更加完善的功能...

    Java电子相册管理系统

    此外,系统可能还需要实现 undo/redo 功能,以便用户可以撤销或重做这些操作,这就需要用到设计模式,如命令模式来记录用户的操作历史。 删除功能相对简单,主要涉及文件操作。Java的File类提供了删除文件的方法,...

    JAVA记事本!非常好用,简便

    4. **撤销与重做**:通过实现undo/redo机制,用户可以方便地撤销或恢复误操作。 5. **剪切、复制和粘贴**:遵循标准的剪贴板操作,方便用户在不同位置之间移动或复制文本。 6. **自动换行**:根据文本长度自动进行...

    72-Java设计模式 命令模式1

    3. **便于实现 undo/redo 操作**:通过维护一个命令的历史记录,可以轻松实现操作的撤销和重做。 4. **便于实现并发控制**:可以将命令放入队列中,实现异步处理。 命令模式的缺点: 1. **过多的命令类**:如果系统...

    use-simple-undo-源码.rar

    Simple Undo库是一个轻量级的解决方案,用于在Java应用程序中实现撤销/重做功能。这个压缩包文件"use-simple-undo-源码.rar"包含的就是Simple Undo库的源代码,通过分析这些源码,我们可以深入理解其工作原理和使用...

    文本编辑器 源代码 java

    5. ** Undo/Redo 功能**:利用栈数据结构实现文本操作的撤销和重做。 6. **查找替换**:通过正则表达式实现文本的查找和替换功能。 7. **多线程**:为了确保用户界面的流畅,可能会用到多线程来分离读写文件等耗时...

Global site tag (gtag.js) - Google Analytics