2014-10-31 63 views
0

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

我创建了类从jpanel扩展,这里我有arraylist保留我的jpanel上的所有元素。

这是如何工作的,当我添加新的元素(FE我画与铅笔工具的东西):

this.elements.add(new PencilElement(this.tool.getPPoint(), this.tool.getCPoint(), this.tool.getColor(), this.tool.getStroke())); 

我想用另一个数组列表把所有元素的副本,当我点击“取消”按钮: - >临时数组列表中的最后一个元素将被删除 - >基本数组列表的内容(在本例中为“元素”数组列表)将被替换为临时数组列表内容。

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

谢谢!

+7

外观上没有任何动作api/java/util/Stack.html – bobbel 2014-10-31 12:12:16

+3

撤消的经典模式 - http://en.wikipedia.org/wiki/Command_pattern – Leo 2014-10-31 12:12:42

回答

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()); 

也请务必禁用重做当http://docs.oracle.com/javase/7/docs/堆栈

0

当你想做一个重做,那么你不应该删除第二个ArrayList中的最后一个元素,因为你需要它来做重做。