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