java 如何撤回
撤回操作在 Java 中的实现方式
在 Java 中,撤回(Undo)功能通常通过以下方法实现,具体取决于应用场景:
命令模式(Command Pattern)
命令模式是实现撤回功能的经典设计模式。通过封装操作为对象,可以存储执行历史并支持撤销。

public interface Command {
void execute();
void undo();
}
public class ConcreteCommand implements Command {
private Receiver receiver;
private String previousState;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
previousState = receiver.getState();
receiver.action();
}
@Override
public void undo() {
receiver.setState(previousState);
}
}
使用栈存储操作历史
通过栈数据结构保存操作状态,实现撤销功能:

import java.util.Stack;
public class UndoManager {
private Stack<Runnable> undoStack = new Stack<>();
public void execute(Runnable command) {
command.run();
undoStack.push(command);
}
public void undo() {
if (!undoStack.isEmpty()) {
Runnable lastCommand = undoStack.pop();
// 执行撤销逻辑
}
}
}
Java Swing 中的 UndoManager
对于 GUI 应用,Java Swing 提供了内置的撤销支持:
import javax.swing.undo.UndoManager;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.JTextComponent;
public class TextUndoExample {
private UndoManager undoManager = new UndoManager();
public void setupUndo(JTextComponent textComponent) {
textComponent.getDocument().addUndoableEditListener(
new UndoableEditListener() {
public void undoableEditHappened(UndoableEditEvent e) {
undoManager.addEdit(e.getEdit());
}
});
}
public void undo() {
if (undoManager.canUndo()) {
undoManager.undo();
}
}
}
数据库事务回滚
对于数据库操作,可以使用事务机制实现撤回:
import java.sql.Connection;
import java.sql.SQLException;
public class DatabaseExample {
public void performTransaction(Connection conn) throws SQLException {
try {
conn.setAutoCommit(false);
// 执行数据库操作
conn.commit();
} catch (SQLException e) {
conn.rollback();
}
}
}
选择哪种实现方式取决于具体应用场景。命令模式适合需要复杂撤销逻辑的应用,栈结构适合简单操作历史,Swing 的 UndoManager 专用于 GUI 应用,事务回滚则适用于数据库操作。






