• 追加された行はこの色です。
  • 削除された行はこの色です。
---
category: swing
folder: UndoManager
title: UndoManagerでJTextFieldのUndo、Redoを行う
tags: [JTextField, JTextComponent, UndoManager, ActionMap, Document]
author: aterai
pubdate: 2009-06-15T13:35:15+09:00
description: JTextFieldのドキュメントにUndoManagerを追加して、Undo、Redoを行います。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTWX1uwgqI/AAAAAAAAApI/zvwc9TUlj4E/s800/UndoManager.png
---
* 概要 [#o9568fb8]
* 概要 [#summary]
`JTextField`のドキュメントに`UndoManager`を追加して、`Undo`、`Redo`を行います。

#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTWX1uwgqI/AAAAAAAAApI/zvwc9TUlj4E/s800/UndoManager.png)

* サンプルコード [#n383e6ed]
* サンプルコード [#sourcecode]
#code(link){{
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, InputEvent.CTRL_DOWN_MASK), "undo");
  imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_DOWN_MASK), "redo");
  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();
    } catch (CannotUndoException ex) {
      // ex.printStackTrace();
      Toolkit.getDefaultToolkit().beep();
    }
  }
}
}}

* 解説 [#bc37965c]
`Document#addUndoableEditListener(UndoManager)`メソッドを使って、`JTextField`で`Undo`、`Redo`が以下のキー入力で実行できるように設定しています。
* 解説 [#explanation]
- `Document#addUndoableEditListener(UndoManager)`メソッドを使用して`JTextField`に`UndoManager`を追加し、以下のキー入力で`Undo`、`Redo`が実行可能になるよう設定
-- `Undo`: KBD{Ctrl+Z}
-- `Redo`: KBD{Ctrl+Y}

- `Undo` : KBD{Ctrl+Z}
- `Redo` : KBD{Ctrl+Y}

* 参考リンク [#k994a5a2]
- [http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#undo Implementing Undo and Redo (Text Component Features The Java™ Tutorialsg)]
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#undo Implementing Undo and Redo (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/undo/UndoManager.html UndoManager (Java Platform SE 8)]
- [[UndoManagerを使用した文字列選択ペーストの動作を変更する>Swing/ReplaceUndoableEdit]]

* コメント [#jdc94c6b]
* コメント [#comment]
#comment
#comment