Java Swing Undo-Redo
Java Swing provides support for undo/redo in applications such as text editors. Bellows are main steps for the implementation:
UndoManager undo_ = new UndoManager();
class UndoAction extends AbstractAction { public UndoAction() { super("Undo"); setEnabled(false); } public void actionPerformed(ActionEvent e) { try { undo_.undo(); // undo the editing } catch (CannotUndoException ex) { System.out.println("Unable to undo: " + ex); ex.printStackTrace(); } updateUndoState(); redoAction.updateRedoState(); } protected void updateUndoState() { if (undo_.canUndo()) // check if undoable { setEnabled(true); putValue(Action.NAME, undo_.getUndoPresentationName()); } else { setEnabled(false); putValue(Action.NAME, "Undo"); } } private final static long serialVersionUID = 5L; } class RedoAction extends AbstractAction { public RedoAction() { super("Redo"); setEnabled(false); } public void actionPerformed(ActionEvent e) { try { undo_.redo(); // redo the edit } catch (CannotRedoException ex) { System.out.println("Unable to redo: " + ex); ex.printStackTrace(); } updateRedoState(); undoAction.updateUndoState(); } protected void updateRedoState() { if (undo_.canRedo()) // check if redoable { setEnabled(true); putValue(Action.NAME, undo_.getRedoPresentationName()); } else { setEnabled(false); putValue(Action.NAME, "Redo"); } } private final static long serialVersionUID = 5L; }
protected class MyUndoableEditListener implements UndoableEditListener { public void undoableEditHappened(UndoableEditEvent e) { // Remember the edit and update the menus. undo_.addEdit(e.getEdit()); undoAction.updateUndoState(); redoAction.updateRedoState(); } }
undoAction = new UndoAction(); menu.add(undoAction); redoAction = new RedoAction(); menu.add(redoAction);
AbstractDocument doc = (AbstractDocument) textPane.getStyledDocument(); doc.addUndoableEditListener(new MyUndoableEditListener());