我已经创建了一个 XML 编辑器,但我停留在最后一个阶段:添加撤消/重做功能。
当用户向 JTree 添加元素、属性或文本时,我只需添加撤消/重做。
我在这方面还很陌生,但今天在学校我尝试(未成功)创建两个堆栈对象 [],称为撤消和重做,并将执行的操作添加到它们中。
例如,我有:
Action AddElement() {
// some code
public void actionPerformed(ActionEvent e) {
performElementAction();
}
}
performElementAction 实际上只是将一个元素添加到 JTree。
我想添加一种方法来将执行的此操作添加到我的撤消堆栈中。有没有一种简单的方法来撤消.push(执行的整个操作)或其他东西?
原文由 Chea Indian 发布,翻译遵循 CC BY-SA 4.0 许可协议
TL;DR:您可以通过实施命令 (p.233) 和 Memento (p.283) 模式( _设计模式 - Gamma 等_)来支持撤消和重做操作。
纪念品模式
这个简单的模式允许您保存对象的状态。只需将对象包装在一个新类中,只要它的状态发生变化,就更新它。
命令模式
命令模式存储原始对象(我们希望支持撤消/重做)和我们在撤消时需要的备忘录对象。此外,还定义了 2 个方法:
代码:
它们定义了扩展命令的逻辑“动作”(例如插入):
应用模式:
最后一步定义撤消/重做行为。核心思想是存储一堆命令,作为命令的历史列表。为了支持重做,您可以在应用撤消命令时保留辅助指针。请注意,无论何时插入新对象,都会删除其当前位置之后的所有命令;这是通过下面定义的
deleteElementsAfterPointer
方法实现的:结论:
这个设计之所以强大,是因为您可以添加任意数量的命令(通过扩展
Command
类),例如RemoveCommand
,UpdateCommand
和 so438-f3上。此外,相同的模式适用于任何类型的对象,使设计可在不同的用例中 重用 和 _修改_。