我想为我的绘图应用程序实现撤消和重做操作。
我创建了一个从jpanel扩展的类,这里我有arraylist来保留我的jpanel上的所有元素。
当我添加新元素时,它是如何工作的(f.e我用铅笔工具绘制的东西):
this.elements.add(new PencilElement(this.tool.getPPoint(), this.tool.getCPoint(), this.tool.getColor(), this.tool.getStroke()));
我想使用另一个arraylist来保存所有元素的副本,当我点击“撤消”按钮时: - >临时数组列表中的最后一个元素将被删除 - >基本arraylist的内容(在这种情况下“元素”arraylist)将被此临时arraylist内容替换。
如果您有其他想法,请分享
谢谢!
答案 0 :(得分:0)
如果要进行重做,则不应删除第二个ArrayList中的最后一个元素,因为重做时需要它。
答案 1 :(得分:0)
使用Deque(Why should I use Deque over Stack?)
创建堆栈建议也是使用堆栈进行操作,这样你就可以从普通的动作堆栈中弹出并推送撤销堆栈,反之则重做。
//当前解决方案的建议
private Deque<PencilElement> undoStack = new ArrayDeque<PencilElement>();
//whenUndo
undoStack.addFirst(myPencilElement);
//whenRedo
elements.add(undoStack.removeFirst());
//New suggestion
//whenUndo
undoStack.addFirst(elements.removeFirst());
//whenRedo
elements.add(undoStack.removeFirst());
还确保在堆栈上没有操作时禁用重做