概要

編集可能なJComboBoxのポップアップメニューでEnterキーが入力された場合のActionListenerの動作をテストします。

サンプルコード

UIManager.put("ComboBox.isEnterSelectablePopup", Boolean.TRUE);
View in GitHub: Java, Kotlin

解説

  • ComboBox.isEnterSelectablePopup: false(default)
    • ポップアップメニューが閉じている状態でEnterキー入力やフォーカス移動で編集を終了するとアクションイベントが2回発生する
      • このアクションイベントでJComboBox#getSelectedItem()を実行するとエディタの値が取得される
    • ポップアップメニューが開いている状態でEnterキーを入力するとアクションイベントが1回発生する
      • 編集不可のJComboBoxの場合と同じ動作
      • このアクションイベントでJComboBox#getSelectedItem()を実行するとリストアイテムの値が取得される
    • 編集可能なJComboBoxのポップアップメニューを開き、マウスカーソルでハイライトを移動してEnterキーを入力してもポップアップメニューは非表示になるが選択状態は変化しない
  • ComboBox.isEnterSelectablePopup: true
    • ポップアップメニューが閉じている状態でEnterキー入力やフォーカス移動で編集を終了するとアクションイベントが2回発生する
      • このアクションイベントでJComboBox#getSelectedItem()を実行するとエディタの値が取得される
    • ポップアップメニューが開いている状態でEnterキーを入力するとアクションイベントが2回発生する
    • 編集可能なJComboBoxのポップアップメニューを開き、マウスカーソルでハイライトを移動してEnterキーを入力するとハイライトされているアイテムが選択されてポップアップメニューは非表示になる
      • このアクションイベントでJComboBox#getSelectedItem()を実行するとリストアイテムの値が取得される
    • 詳細はjavax/swing/plaf/basic/BasicComboBoxUI.javaを参照
      // Forces the selection of the list item
      boolean isEnterSelectablePopup = UIManager.getBoolean("ComboBox.isEnterSelectablePopup");
      if (!comboBox.isEditable() || isEnterSelectablePopup || ui.isTableCellEditor) {
        Object listItem = ui.popup.getList().getSelectedValue();
        if (listItem != null) {
          // Use the selected value from popup
          // to set the selected item in combo box,
          // but ensure before that JComboBox.actionPerformed()
          // won't use editor's value to set the selected item
          comboBox.getEditor().setItem(listItem);
          comboBox.setSelectedItem(listItem);
        }
      }
      comboBox.setPopupVisible(false);
      
  • JComboBox#addItemListener(...)で追加したItemListenerにはこの設定は影響しない
  • UIManager.getBoolean("ComboBox.noActionOnKeyNavigation") == trueの場合、この設定は無視されComboBox.isEnterSelectablePopup: trueと同じ動作になる
    • JComboBoxのドロップダウンリストでカーソルキーナビゲーションを無効にする
    • ポップアップメニューが開いている状態で、Enterキーを入力するとアクションイベントが2回発生する
  • ComboBox.isEnterSelectablePopupの設定はEnterキーが入力されると毎回UIManager.getBoolean("ComboBox.isEnterSelectablePopup")で取得されるので、切替はPopupMenuListener#popupMenuWillBecomeVisible(...)メソッドをオーバーライドして実行

参考リンク

コメント