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

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

阅读更多
三, DrawLineCommand,实现一次Undo/Redo功能

一个继承了UndoableCommand提供具体的撤销/恢复功能的子类,就可以实现一次Undo/Redo。这里实现一个在容器上画直线的子类DrawLineCommand,带有擦除和重画直线的功能。

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.util.Random;

public class DrawLineCommand extends UndoableCommand {

    private int x1, y1, x2, y2;
    private Container container;

    public DrawLineCommand(Container container) {
        this.container = container;
        x1 = new Random().nextInt(100) + 100;
        y1 = new Random().nextInt(100) + 100;
        x2 = new Random().nextInt(100) + 300;
        y2 = new Random().nextInt(100) + 250;
    }

    @Override
    public void command() {
        drawLine(Color.RED);
        System.out.print("Draw a ");
        System.out.println(toString());
    }

    @Override
    public void restore() {
        drawLine(container.getBackground());
        System.out.print("Erase the ");
        System.out.println(toString());
    }

    private void drawLine(Color c) {
        Graphics g = container.getGraphics();
        g.setColor(c);
        g.drawLine(x1, y1, x2, y2);
        g.dispose();
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("line between point(");
        stringBuilder.append(x1).append(",").append(y1).append(") and point(");
        stringBuilder.append(x2).append(",").append(y2).append(")");
        return stringBuilder.toString();
    }
}


下面给出一个UndoTest类来测试DrawLineCommand

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

public class UndoTest extends JFrame {

    UndoableCommand command;
    Action drawLineAction, undoAction, redoAction;

    public UndoTest() {
        undoAction = new AbstractAction("Undo") {

            @Override
            public void actionPerformed(ActionEvent e) {
                command.undo();
                setEnabled(false);
                redoAction.setEnabled(true);
            }
        };
        undoAction.setEnabled(false);

        redoAction = new AbstractAction("Redo") {

            @Override
            public void actionPerformed(ActionEvent e) {
                command.redo();
                setEnabled(false);
                undoAction.setEnabled(true);
            }
        };
        redoAction.setEnabled(false);

        drawLineAction = new AbstractAction("Draw Line") {

            @Override
            public void actionPerformed(ActionEvent e) {
                command = new DrawLineCommand(getContentPane());
                command.execute();
                undoAction.setEnabled(true);
            }
        };
    }

    public void createAndShowGUI() {
        JToolBar toolBar = new JToolBar();
        toolBar.add(drawLineAction);
        toolBar.add(undoAction);
        toolBar.add(redoAction);
        add(toolBar, BorderLayout.NORTH);
        setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new UndoTest().createAndShowGUI();
            }
        });
    }
}

结果:DrawLineCommand能完美完成最近一次的Undo/Redo

可见,用UndoableCommand来实现一次Undo/Redo功能是可行的,那么如何实现多次或者无限制的Undo/Redo呢?
0
1
分享到:
评论
1 楼 Astray_hao 2016-04-15  
  

相关推荐

    设计模式Java-侯捷

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

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

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

    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...

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

    在实际编码过程中,撤消重做堆栈的实现可以采用多种语言,如C++、Java、Python或JavaScript。在面向对象语言中,通常会定义一个接口或抽象类来规定所有可撤销操作的共同行为,然后让具体操作类继承或实现这个接口。...

    Qt撤销恢复功能经典例子(QUndoStack、QCommands、QUndoGroup)

    在Qt框架中,撤销恢复功能是通过QUndoStack、QCommand和QUndoGroup类来实现的,这些类提供了强大的机制,使得用户可以在应用程序中轻松地实现撤销和恢复操作。本例子详细展示了如何在Qt项目中集成撤销恢复功能,特别...

    备忘录模式笔记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记事本

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

    java swimg 实现的写字板

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

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

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

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

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

    EditPlus 3.3 简体中文

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

    java做的典型小记事本

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

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

    4. **Undo/Redo功能**: `javax.swing.undo.*` 包提供了撤销/重做功能。`UndoManager` 类管理一系列的可逆操作,使得用户可以撤销或重做对文本的修改。 5. **文本处理**: `JTextArea` 的`Document`对象可以添加`...

    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库的源代码,通过分析这些源码,我们可以深入理解其工作原理和使用...

Global site tag (gtag.js) - Google Analytics