Java tutorial
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JLabel; 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.CannotUndoException; import javax.swing.undo.UndoManager; class UndoableTextArea extends JTextArea implements UndoableEditListener, FocusListener, KeyListener { private UndoManager m_undoManager; public UndoableTextArea() { this(new String()); } public UndoableTextArea(String text) { super(text); getDocument().addUndoableEditListener(this); this.addKeyListener(this); this.addFocusListener(this); } private void createUndoMananger() { m_undoManager = new UndoManager(); m_undoManager.setLimit(10); } private void removeUndoMananger() { m_undoManager.end(); } public void focusGained(FocusEvent fe) { createUndoMananger(); } public void focusLost(FocusEvent fe) { removeUndoMananger(); } public void undoableEditHappened(UndoableEditEvent e) { m_undoManager.addEdit(e.getEdit()); } public void keyPressed(KeyEvent e) { if ((e.getKeyCode() == KeyEvent.VK_Z) && (e.isControlDown())) { try { m_undoManager.undo(); } catch (CannotUndoException cue) { Toolkit.getDefaultToolkit().beep(); } } if ((e.getKeyCode() == KeyEvent.VK_Y) && (e.isControlDown())) { try { m_undoManager.redo(); } catch (CannotRedoException cue) { Toolkit.getDefaultToolkit().beep(); } } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } public class Main extends JFrame { UndoableTextArea m_undoableTextArea = new UndoableTextArea(); public Main() { JScrollPane sc = new JScrollPane(m_undoableTextArea); getContentPane().setLayout(new BorderLayout(10, 10)); getContentPane().add(BorderLayout.NORTH, new JLabel("Press, CTRL+Z to Undo, CTRL+Y to Redo...")); getContentPane().add(BorderLayout.CENTER, sc); } public static void main(String[] arg) { Main m = new Main(); m.setVisible(true); m.setSize(new Dimension(400, 300)); m.validate(); } }