Programa deshacer en Java swing


DESCARGAR

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.UndoManager;
public class Deshacer extends JFrame 
{
  protected JTextArea textArea = new JTextArea();
  
  protected UndoManager undoManager = new UndoManager();
  protected JButton deshacerBoton = new JButton("Deshacer");
  protected JButton rehacerBoton = new JButton("Rehacer");
  public Deshacer() {
    super("Prueba deshacer/rehacer");//nombre de la ventana
    deshacerBoton.setEnabled(false);
    rehacerBoton.setEnabled(false);
    JPanel buttonPanel = new JPanel(new GridLayout());
    buttonPanel.add(deshacerBoton);
    buttonPanel.add(rehacerBoton);
    JScrollPane scroller = new JScrollPane(textArea);
    getContentPane().add(buttonPanel, BorderLayout.NORTH);
    getContentPane().add(scroller, BorderLayout.CENTER);
    textArea.getDocument().addUndoableEditListener(
        new UndoableEditListener() {
          public void undoableEditHappened(UndoableEditEvent e) {
            undoManager.addEdit(e.getEdit());
            updateButtons();
          }
        });
    deshacerBoton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          undoManager.undo();
        } catch (CannotRedoException cre) {
          cre.printStackTrace();
        }
        updateButtons();
      }
    });
    rehacerBoton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          undoManager.redo();
        } catch (CannotRedoException cre) {
          cre.printStackTrace();
        }
        updateButtons();
      }
    });
    setSize(400, 300);
    setVisible(true);
  }
  public void updateButtons() {
    
    deshacerBoton.setText("Se puede Deshacer");
    rehacerBoton.setText("Se puede Rehacer");
    deshacerBoton.setEnabled(undoManager.canUndo());
    rehacerBoton.setEnabled(undoManager.canRedo());
  }
  public static void main(String argv[]) {
    new Deshacer();
  }
}