Java 使用ArrayList撤消操作

Java 使用ArrayList撤消操作,java,arraylist,Java,Arraylist,我想为我的绘画应用程序实现撤消和重做操作 我创建了一个从jpanel扩展而来的类,这里我有arraylist来保存jpanel上的所有元素 这就是我添加新元素时的工作原理(例如,我用铅笔工具画东西): 我想使用另一个arraylist保存所有元素的副本,当我单击“撤消”按钮时: -->将删除临时数组列表中的最后一个元素 -->基本arraylist的内容(在本例中为“elements”arraylist)将替换为此临时arraylist内容 如果你有其他想法,请分享 谢谢 如果要重做,则不应从第

我想为我的绘画应用程序实现撤消和重做操作

我创建了一个从jpanel扩展而来的类,这里我有arraylist来保存jpanel上的所有元素

这就是我添加新元素时的工作原理(例如,我用铅笔工具画东西):

我想使用另一个arraylist保存所有元素的副本,当我单击“撤消”按钮时: -->将删除临时数组列表中的最后一个元素 -->基本arraylist的内容(在本例中为“elements”arraylist)将替换为此临时arraylist内容

如果你有其他想法,请分享


谢谢

如果要重做,则不应从第二个ArrayList中删除最后一个元素,因为重做时需要它。

使用Deque()创建堆栈

建议对操作也使用一个堆栈,这样您就可以从普通操作堆栈中弹出并推送撤消堆栈,而在重做时则相反

//当前解决方案的建议

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());
private Deque undoStack=new ArrayDeque();
//whenUndo
undoStack.addFirst(mypencilement);
//whenRedo
元素添加(undoStack.removeFirst());
//新建议
//whenUndo
undoStack.addFirst(elements.removeFirst());
//whenRedo
元素添加(undoStack.removeFirst());

另外,确保在堆栈上没有任何操作时禁用“重做”

查看“撤消”的经典模式-
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());