Java tutorial
import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JRadioButton; import javax.swing.JToggleButton; import javax.swing.undo.AbstractUndoableEdit; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.CompoundEdit; import javax.swing.undo.UndoableEdit; public class UndoableToggleApp2 extends JFrame { private CompoundEdit edit; private JButton undoButton = new JButton("Undo"); private JButton redoButton = new JButton("Redo"); private JButton endButton = new JButton("End"); public UndoableToggleApp2() { JToggleButton tog = new JToggleButton("ToggleButton"); JCheckBox cb = new JCheckBox("CompoundEdit ExampleCheckBox"); JRadioButton radio = new JRadioButton("RadioButton"); SimpleListener sl = new SimpleListener(); tog.addActionListener(sl); cb.addActionListener(sl); radio.addActionListener(sl); Box buttonBox = new Box(BoxLayout.Y_AXIS); buttonBox.add(tog); buttonBox.add(cb); buttonBox.add(radio); undoButton.setEnabled(false); redoButton.setEnabled(false); endButton.setEnabled(false); undoButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { try { edit.undo(); } catch (CannotUndoException ex) { ex.printStackTrace(); } finally { undoButton.setEnabled(edit.canUndo()); redoButton.setEnabled(edit.canRedo()); } } }); redoButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { try { edit.redo(); } catch (CannotRedoException ex) { ex.printStackTrace(); } finally { undoButton.setEnabled(edit.canUndo()); redoButton.setEnabled(edit.canRedo()); } } }); endButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { edit.end(); endButton.setEnabled(false); undoButton.setEnabled(edit.canUndo()); redoButton.setEnabled(edit.canRedo()); } }); Box undoRedoEndBox = new Box(BoxLayout.X_AXIS); undoRedoEndBox.add(Box.createGlue()); undoRedoEndBox.add(undoButton); undoRedoEndBox.add(Box.createHorizontalStrut(2)); undoRedoEndBox.add(redoButton); undoRedoEndBox.add(Box.createHorizontalStrut(2)); undoRedoEndBox.add(endButton); undoRedoEndBox.add(Box.createGlue()); Container content = getContentPane(); content.setLayout(new BorderLayout()); content.add(buttonBox, BorderLayout.CENTER); content.add(undoRedoEndBox, BorderLayout.SOUTH); setSize(400, 150); } public class SimpleListener implements ActionListener { public void actionPerformed(ActionEvent ev) { if (edit == null || edit.isInProgress() == false) edit = new CompoundEdit(); JToggleButton tb = (JToggleButton) ev.getSource(); UndoableEdit togEdit = new UndoableToggleEdit(tb); edit.addEdit(togEdit); endButton.setEnabled(true); undoButton.setEnabled(edit.canUndo()); redoButton.setEnabled(edit.canRedo()); } } // Main program just creates the frame and displays it. public static void main(String[] args) { JFrame f = new UndoableToggleApp2(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } } class UndoableToggleEdit extends AbstractUndoableEdit { private JToggleButton button; private boolean selected; // Create a new edit for a JToggleButton that has just been toggled. public UndoableToggleEdit(JToggleButton button) { this.button = button; selected = button.isSelected(); } // Return a reasonable name for this edit. public String getPresentationName() { return "Toggle " + button.getText() + " " + (selected ? "on" : "off"); } // Redo by setting the button state as it was initially. public void redo() throws CannotRedoException { super.redo(); button.setSelected(selected); } // Undo by setting the button state to the opposite value. public void undo() throws CannotUndoException { super.undo(); button.setSelected(!selected); } }