package urdo;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
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;
public class NewJFrame extends javax.swing.JFrame {
private JPanel jp1;
private JButton jb1;
private JButton jb2;
private JMenuItem jm12;
private JMenuItem jm11;
private JMenu jm;
private JMenuBar jMenuBar1;
private JTextArea jta;
private JScrollPane jsp;
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
NewJFrame inst = new NewJFrame();
inst.setVisible(true);
}
public NewJFrame() {
super();
initGUI();
}
private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
{
jMenuBar1 = new JMenuBar();
setJMenuBar(jMenuBar1);
{
jm = new JMenu();
jMenuBar1.add(jm);
jm.setText("jm");
{
jm11 = new JMenuItem(redoAction);
jm.add(jm11);
jm11.setText("re");
}
{
jm12 = new JMenuItem(undoAction);
jm.add(jm12);
jm12.setText("undo");
}
jm12.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,
InputEvent.CTRL_MASK));
}
}
{
jp1 = new JPanel();
getContentPane().add(jp1, BorderLayout.NORTH);
jp1.setPreferredSize(new java.awt.Dimension(392, 35));
{
jb1 = new JButton(redoAction);
jp1.add(jb1);
jb1.setText("redo");
}
// jb1.registerKeyboardAction(redoAction, KeyStroke.getKeyStroke(
// KeyEvent.VK_Y, KeyEvent.CTRL_DOWN_MASK, true),
// JComponent.WHEN_IN_FOCUSED_WINDOW);
{
jb2 = new JButton(undoAction);
jp1.add(jb2);
jb2.setText("undo");
}
// jb2.registerKeyboardAction(undoAction, KeyStroke.getKeyStroke(
// KeyEvent.VK_Z, KeyEvent.CTRL_DOWN_MASK, true),
// JComponent.WHEN_IN_FOCUSED_WINDOW);
}
{
jsp = new JScrollPane();
getContentPane().add(jsp, BorderLayout.CENTER);
{
jta = new JTextArea();
jsp.setViewportView(jta);
jta.getDocument().addUndoableEditListener(undoHandler);
}
}
pack();
setSize(400, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
protected UndoableEditListener undoHandler = new UndoHandler();
protected UndoManager undo = new UndoManager();
private UndoAction undoAction = new UndoAction();
private RedoAction redoAction = new RedoAction();
class UndoHandler implements UndoableEditListener {
/**
* Messaged when the Document has created an edit, the edit is
* added to <code>undo</code>, an instance of UndoManager.
*/
public void undoableEditHappened(UndoableEditEvent e) {
undo.addEdit(e.getEdit());
undoAction.update();
redoAction.update();
}
}
class UndoAction extends AbstractAction {
public UndoAction() {
super();
setEnabled(false);
}
public void actionPerformed(ActionEvent e) {
try {
undo.undo();
} catch (CannotUndoException ex) {
ex.printStackTrace();
}
update();
redoAction.update();
}
protected void update() {
if (undo.canUndo()) {
setEnabled(true);
// System.out.println(undo.getUndoPresentationName());
putValue(Action.NAME, undo.getUndoPresentationName());
} else {
setEnabled(false);
putValue(Action.NAME, "撤消");
}
}
}
class RedoAction extends AbstractAction {
public RedoAction() {
super();
setEnabled(false);
}
public void actionPerformed(ActionEvent e) {
try {
undo.redo();
} catch (CannotRedoException ex) {
ex.printStackTrace();
}
update();
undoAction.update();
}
protected void update() {
if (undo.canRedo()) {
setEnabled(true);
putValue(Action.NAME, undo.getRedoPresentationName());
} else {
setEnabled(false);
putValue(Action.NAME, "重做");
}
}
}
}