UndoManagerDemo.java Source code

Java tutorial

Introduction

Here is the source code for UndoManagerDemo.java

Source

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Enumeration;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.UndoableEditEvent;
import javax.swing.undo.AbstractUndoableEdit;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.UndoManager;

public class UndoManagerDemo extends JFrame {
    protected Vector pointVector = new Vector();

    protected PaintCanvas canvas = new PaintCanvas(pointVector);

    protected UndoManager undoManager = new UndoManager();

    protected JButton undoButton = new JButton("Undo");

    protected JButton redoButton = new JButton("Redo");

    public UndoManagerDemo() {
        super("Undo/Redo Demo");

        undoButton.setEnabled(false);
        redoButton.setEnabled(false);

        JPanel buttonPanel = new JPanel(new GridLayout());
        buttonPanel.add(undoButton);
        buttonPanel.add(redoButton);

        getContentPane().add(buttonPanel, BorderLayout.NORTH);
        getContentPane().add(canvas, BorderLayout.CENTER);

        canvas.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                Point point = new Point(e.getX(), e.getY());
                pointVector.addElement(point);

                undoManager.undoableEditHappened(
                        new UndoableEditEvent(canvas, new UndoablePaintSquare(point, pointVector)));

                undoButton.setText(undoManager.getUndoPresentationName());
                redoButton.setText(undoManager.getRedoPresentationName());
                undoButton.setEnabled(undoManager.canUndo());
                redoButton.setEnabled(undoManager.canRedo());
                canvas.repaint();
            }
        });

        undoButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    undoManager.undo();
                } catch (CannotRedoException cre) {
                    cre.printStackTrace();
                }
                canvas.repaint();
                undoButton.setEnabled(undoManager.canUndo());
                redoButton.setEnabled(undoManager.canRedo());
            }
        });

        redoButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    undoManager.redo();
                } catch (CannotRedoException cre) {
                    cre.printStackTrace();
                }
                canvas.repaint();
                undoButton.setEnabled(undoManager.canUndo());
                redoButton.setEnabled(undoManager.canRedo());
            }
        });

        setSize(400, 300);
        setVisible(true);
    }

    public static void main(String argv[]) {
        new UndoManagerDemo();
    }

    class PaintCanvas extends JPanel {
        private Vector points;

        protected int width = 50;

        protected int height = 50;

        public PaintCanvas(Vector v) {
            super();
            points = v;
            setOpaque(true);
            setBackground(Color.white);
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.black);

            for (int i = 0; i < points.size(); i++) {
                Point point = (Point) points.get(i);
                g.drawRect(point.x, point.y, width, height);
            }
        }
    }

    class UndoablePaintSquare extends AbstractUndoableEdit {
        protected Vector points;

        protected Point point;

        public UndoablePaintSquare(Point p, Vector v) {
            points = v;
            point = p;
        }

        public String getPresentationName() {
            return "Square Addition";
        }

        public void undo() {
            super.undo();
            points.remove(point);
        }

        public void redo() {
            super.redo();
            points.add(point);
        }
    }
}