gpt4 book ai didi

java - 使用堆栈实现撤消/重做方法

转载 作者:行者123 更新时间:2023-12-01 21:14:55 24 4
gpt4 key购买 nike

我想使用堆栈(而不是 swing)创建“撤消”和“重做”按钮。

单击“撤消”时,文本字段、列表和所有内容都需要撤消/重做。我知道我必须使用 pop、push 等。但是我要在堆栈中放入什么?文本字段值?列出内容?

示例:

  • 我在一所学校注册了一名学生。
    • 文本字段中的学生信息已更改
    • 学生列表包含新学生

如何重置这些?

有没有办法只将项目数据的当前状态存储在堆栈中?

最佳答案

希望我的理解是正确的,因为我不太明白“使用堆栈(而不是 Swing )”的意思。 Stack 是一种数据结构,Swing 是一个 UI 框架。所以这些基本上彼此无关。

实现撤消/重做通常是通过使用以下方法之一来完成的。您应该使用哪一种取决于您想要的撤消/重做行为。

Undo/redo using the Command Pattern.

实现这种方法看起来像这样:

public interface ICommand {
void do();
void undo();
}

public class StudentSaveCommand implements ICommand {

public StudentSaveCommand(Student student) { ... }
[...]
}

StudentSaveCommand 类的 do() 实现中,您实现了实际保存给定学生应采取的操作,例如将数据插入数据库、保存到文件或简单地将其添加到列表中。在 undo() 实现中,您可以实现恢复 do() 实现的操作,例如从数据库中删除、删除文件或将其从列表中删除。

要最终使用 Stack 实现撤消/重做功能,您需要执行以下操作:

public void btnSaveStudentClickHandler() {
ICommand c = new IStudentSaveCommand(theStudentFromGUI);
c.do();
_redoStack.clear();
_undoStack.push(c);
}

public void btnUndoClickHandler() {
ICommand undoCommand = _undoStack.pop();
undoCommand.undo();
_redoStack.push(undoCommand);
}

public void btnRedoClickHandler() {
ICommand redoCommand = _redoStack.pop();
redoCommand.do();
_undoStack.push(redoCommand);
}

为了轻松地将模型的更改反射(reflect)到 GUI,我将实现/使用某种数据绑定(bind)。正如您所看到的,这种方法不太适合在非常细粒度的级别上实现撤消/重做,例如更改文本框中学生的姓名。这是第二种方法。

Undo/redo using Memento Pattern.

使用此模式可以保存和恢复对象的状态,例如一个学生。使用此模式和 Stack 的代码实现撤消/重做功能可能如下所示:

public void txtStudentNameLostFocusHandler() {
Memento sm = student.getSavedState();
_redoStack.clear();
_undoStack.push(sm);
}

public void btnUndoClickHandler() {
Memento m = _undoStack.pop();
student.restoreSavedState(m);
_redoStack.push(m);
}

// [...] Redo implementation straight-forward

为了反射(reflect)对 Student 对象所做的更改,我还更喜欢数据绑定(bind)或实现如下所示的方法,该方法必须在撤消/重做操作后调用:

public void updateStudentGUI(Student student) {
txtName.setText(student.getName());
[...]
}
<小时/>

要在撤消/重做实现中发挥这两种方法的优点,您也可以将它们结合起来。然而,最好的方法在很大程度上取决于规范,分别取决于您真正想要实现的目标。

关于java - 使用堆栈实现撤消/重做方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40391202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com