• category: swing folder: ComboBoxEnterSelectablePopup title: JComboBoxのポップアップメニューでEnterキーが入力された場合のActionListenerの動作をテストする tags: [JComboBox, ActionListener] author: aterai pubdate: 2017-07-10T15:41:36+09:00 description: 編集可能なJComboBoxのポップアップメニューでEnterキーが入力された場合のActionListenerの動作をテストします。 image: https://drive.google.com/uc?id=1IRqx7XfCe8R_uKdyEiatC5Ro-ucy_GPnZw

概要

編集可能な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()を実行するとリストアイテムの値が取得される
  • ComboBox.isEnterSelectablePopup: true
    • ポップアップメニューが閉じている状態で、Enterキー入力やフォーカス移動で編集を終了するとアクションイベントが2回発生する
      • このアクションイベントでJComboBox#getSelectedItem()を実行するとエディタの値が取得される
    • ポップアップメニューが開いている状態で、Enterキーを入力するとアクションイベントが2回発生する
      • このアクションイベントで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と同じ動作になる
      • ポップアップメニューが開いている状態で、Enterキーを入力するとアクションイベントが2回発生する
    • ComboBox.isEnterSelectablePopupの設定はEnterキーが入力されると毎回UIManager.getBoolean("ComboBox.isEnterSelectablePopup")で取得されるので、切替はPopupMenuListener#popupMenuWillBecomeVisible(...)メソッドをオーバーライドして実行

参考リンク

コメント