Это было безумно полезно для программы, которую я использую для рисования, и не смог реализовать состояния Undo / Redo из-за того, что BufferedImages на Stacks практически идентичен.
Кстати, я предлагаю полностью использовать пару стеков для таких операций!Каждый раз, когда вы что-то делаете, немедленно создайте новое изображение, используйте метод deepCopy, упомянутый выше
image = deepCopy((BufferedImage) stackUndo.peek());
, измените изображение по своему усмотрению, затем, когда вы прекращаете редактирование (например, когда отпускаете кнопку мыши), выполняйте
stackUndo.push(image);
и всегда рисуйте элемент в верхней части левого стека
g.drawImage(stackUndo.peek(),x,y,null);
, а затем, если вы выполняете какую-либо операцию отмены / восстановления, выполните что-то вроде этого
public void undoOrRedo(String op) {
if(op.equals("undo") && stackUndo.size()>1){
stackRedo.push(stackUndo.pop());
repaint();
}
if(op.equals("redo") && stackRedo.size()>0){
stackUndo.push(stackRedo.pop());
repaint();
}
}
Обязательно всегда оставляйте что-то в левом стеке, потому что для рисования он всегда будет использовать элемент сверху (заглядывать)!