概要

JTextFieldのドキュメントにUndoManagerを追加して、UndoRedoを行います。

サンプルコード

private static void initUndoRedo(JTextComponent tc) {
  UndoManager manager = new UndoManager();
  tc.getDocument().addUndoableEditListener(manager);
  tc.getActionMap().put("undo", new UndoAction(manager));
  tc.getActionMap().put("redo", new RedoAction(manager));
  InputMap imap = tc.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
  imap.put(KeyStroke.getKeyStroke(
    KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "undo");
  imap.put(KeyStroke.getKeyStroke(
    KeyEvent.VK_Y, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "redo");
}
private static class UndoAction extends AbstractAction {
  private final UndoManager undoManager;
  public UndoAction(UndoManager manager) {
    super("undo");
    this.undoManager = manager;
  }
  @Override public void actionPerformed(ActionEvent e) {
    try {
      undoManager.undo();
    } catch (CannotUndoException cue) {
      //cue.printStackTrace();
      Toolkit.getDefaultToolkit().beep();
    }
  }
}
view all

解説

Document#addUndoableEditListener(UndoManager)メソッドを使って、JTextFieldUndoRedoが以下のキー入力で実行できるように設定しています。

  • Undo : Ctrl+Z
  • Redo : Ctrl+Y

参考リンク

コメント