« Trac Discussion Plugin(4) | Main | Tableの内容をソート »

2006.08.04

JOptionPaneでカーソルキーを反応させる

 JOptionPaneを使用すると、「はい」「いいえ」の2択ダイアログなどを

int ret = JOptionPane.showConfirmDialog(
  this,
  "終了します。\nよろしいですか?",
  "確認",
  JOptionPane.YES_NO_OPTION,
  JOptionPane.QUESTION_MESSAGE);

ってな感じでサクッと作ることが出来ますが、デフォルトの状態ではいくつか難点が。

  • 左右のカーソルキーでフォーカスが移動しない。
  • ボタンにはY/Nが表示されているが、そのままでは反応しない(ALT+Y/ALT+Nは反応します)。

     んなわけで、何とかならないかなぁ、ということでこんなの作ってみました。無名インナークラスとして作成していますが、単独のクラスとして切り出すことによりいろんなところで使い回すことが出来ると思います。

    private KeyEventDispatcher dialogKeyEventDispatcher = new KeyEventDispatcher() {
      public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED) {
          if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
            return true;
          } else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            KeyboardFocusManager.getCurrentKeyboardFocusManager().focusPreviousComponent();
            return true;
          } else if (e.getKeyCode() == KeyEvent.VK_Y || e.getKeyCode() == KeyEvent.VK_N) {
            // ALTをマスクした状態で新しいイベントとして処理を委譲します。
            KeyboardFocusManager.getCurrentKeyboardFocusManager().dispatchKeyEvent(
              new KeyEvent(
                (Component)e.getSource(),
                e.getID(),
                e.getWhen(),
                KeyEvent.ALT_DOWN_MASK,
                e.getKeyCode(),
                e.getKeyChar()));
            return true;
          }
        }
      return KeyboardFocusManager.getCurrentKeyboardFocusManager().dispatchKeyEvent(e);
      }
    };

    新しいイベントを作り直してそれを投げ直しているのが、果たして行儀がいいのかどうか(^^;

  • |

    « Trac Discussion Plugin(4) | Main | Tableの内容をソート »

    Java」カテゴリの記事

    Comments

    Post a comment



    (Not displayed with comment.)


    Comments are moderated, and will not appear on this weblog until the author has approved them.



    TrackBack


    Listed below are links to weblogs that reference JOptionPaneでカーソルキーを反応させる:

    « Trac Discussion Plugin(4) | Main | Tableの内容をソート »