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