Mega Code Archive

 
Categories / Java / Swing JFC
 

Undo manager

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