三, 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呢?
分享到:
相关推荐
综上所述,本文主要围绕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...
在实际编码过程中,撤消重做堆栈的实现可以采用多种语言,如C++、Java、Python或JavaScript。在面向对象语言中,通常会定义一个接口或抽象类来规定所有可撤销操作的共同行为,然后让具体操作类继承或实现这个接口。...
在Qt框架中,撤销恢复功能是通过QUndoStack、QCommand和QUndoGroup类来实现的,这些类提供了强大的机制,使得用户可以在应用程序中轻松地实现撤销和恢复操作。本例子详细展示了如何在Qt项目中集成撤销恢复功能,特别...
* 它可以实现 Undo/Redo 操作,例如文本编辑器的撤销和重做操作。 * 它可以用于游戏存档、数据库rollback 等场景。 备忘录模式的缺点 虽然备忘录模式非常有用,但它也有一些缺点,例如: * 它可能会增加系统的...
这样,调用者可以调用`undo()`来恢复前一次的执行状态。 7. **UML类图**: 在UML设计类图中,通常会包含如下元素:`Command`接口、具体命令类(如`LightOnCommand`和`LightOffCommand`)、接收者类(如`Light`)、...
这一功能通常基于undo/redo堆栈,每次编辑操作都会在堆栈上留下一个状态,用户可以通过撤销和重做命令在这些状态之间切换。 最后,文本查找功能让开发者能够快速搜索代码中的特定字符串或模式。这个功能通常支持...
在Java编程中,实现记事本的撤销功能是一项常见的任务,它涉及到文本编辑器的核心功能。撤销功能允许用户取消最近的操作,恢复到之前的状态。在本文中,我们将深入探讨如何在Java中构建这样的功能,主要关注`frame`...
5. ** undo/redo机制**:了解如何实现撤销/重做功能,这通常通过维护一个操作栈来实现,每次用户执行操作都将其压栈,撤销时从栈顶弹出并回滚。 6. 图像处理:如果记事本支持图片,可能涉及到对图像文件的读取和...
9. **Undo/Redo功能**: 写字板通常会有撤销/重做功能,这需要实现自己的命令设计模式,记录用户的每一个编辑操作,以便在需要时恢复或重复。 10. **事件调度线程(Event Dispatch Thread, EDT)**: Java GUI的更新...
此外,我们还需要考虑其他常见的文本编辑功能,如撤销/重做(Undo/Redo)、查找/替换(Find/Replace)等。这些功能可以通过维护一个操作历史栈,每次进行编辑操作时,都将旧状态压入栈中。当用户触发撤销或重做时,...
此外,可能还需要提供一个`redo()`方法来恢复撤销的操作。对于更复杂的功能,如连续操作或表达式解析,可能需要使用更高级的数据结构和算法。 这个简单的有撤销功能的Java计算器展示了如何利用面向对象编程、数据...
你可以使用EditPlus来完全替代Windows的记事本,因为EditPlus不仅拥有记事本的所有功能,而且还拥有无限制的 Undo/Redo、英文拼字检查、自动换行、列数标记、搜索替代、同时编辑多文件、全屏幕浏览等更加完善的功能...
对于撤销/重做,Java的AbstractDocument类支持基于undo/redo的操作,可以记录用户的编辑历史。 在代码组织上,遵循面向对象的原则,可能会有独立的类来处理特定的功能,比如TextEditor类负责文本编辑,MenuHandler...
4. **Undo/Redo功能**: `javax.swing.undo.*` 包提供了撤销/重做功能。`UndoManager` 类管理一系列的可逆操作,使得用户可以撤销或重做对文本的修改。 5. **文本处理**: `JTextArea` 的`Document`对象可以添加`...
此外,系统可能还需要实现 undo/redo 功能,以便用户可以撤销或重做这些操作,这就需要用到设计模式,如命令模式来记录用户的操作历史。 删除功能相对简单,主要涉及文件操作。Java的File类提供了删除文件的方法,...
4. **撤销与重做**:通过实现undo/redo机制,用户可以方便地撤销或恢复误操作。 5. **剪切、复制和粘贴**:遵循标准的剪贴板操作,方便用户在不同位置之间移动或复制文本。 6. **自动换行**:根据文本长度自动进行...
3. **便于实现 undo/redo 操作**:通过维护一个命令的历史记录,可以轻松实现操作的撤销和重做。 4. **便于实现并发控制**:可以将命令放入队列中,实现异步处理。 命令模式的缺点: 1. **过多的命令类**:如果系统...
Simple Undo库是一个轻量级的解决方案,用于在Java应用程序中实现撤销/重做功能。这个压缩包文件"use-simple-undo-源码.rar"包含的就是Simple Undo库的源代码,通过分析这些源码,我们可以深入理解其工作原理和使用...