Visual Tagging Tool

Java Swing Undo-Redo

Java Swing provides support for undo/redo in applications such as text editors. Bellows are main steps for the implementation:

  • Instantiate UndoManager object
    	UndoManager undo_ = new UndoManager();
    

  • Create UndoAction and RedoAction class
    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;
    }
    

  • Create MyUndoableEditListener class
    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();
    	}
    }
    

  • Instantiate UndoAction and RedoAction objects, and add to menu
    	undoAction = new UndoAction();
    	menu.add(undoAction);
    
    	redoAction = new RedoAction();
    	menu.add(redoAction);
    

  • Add MyUndoableEditListener and watching for undoable changes
    	AbstractDocument doc = (AbstractDocument) textPane.getStyledDocument();
    	doc.addUndoableEditListener(new MyUndoableEditListener());