Swing JFC Java

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