概要

JComboBoxで編集した後の文字列がドロップダウンリスト中に存在する場合、そのアイテムを選択するように設定します。

サンプルコード

class SelectItemMenuListener implements PopupMenuListener {
  @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
    JComboBox<?> c = (JComboBox<?>) e.getSource();
    c.setSelectedItem(c.getEditor().getItem());
  }

  @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
    /* not needed */
  }

  @Override public void popupMenuCanceled(PopupMenuEvent e) {
    /* not needed */
  }
}
View in GitHub: Java, Kotlin

解説

  • Default
    • "123456"を編集して"a"に変更しドロップダウンリストを開くと"123456"が選択状態になる
  • popupMenuWillBecomeVisible
    • "123456"を編集して"a"に変更しドロップダウンリストを開くと"a"が選択状態になる
    • PopupMenuListenerを追加し、popupMenuWillBecomeVisible(...)メソッドで編集された文字列がドロップダウンリストに存在する場合は選択する
    • ドロップダウンリストを開いたときに編集後の文字列がリストに存在しない場合は選択状態がクリアされる
  • +enterPressed Action
    • "123456"を編集して"123456a"に変更しEnter、次に文字列を"a"に変更してからドロップダウンリストを開くと、リストに"123456a"が追加され"a"が選択状態になる
    • Enterキーを押した場合、アイテムを追加するアクションをActionMapに追加
      Action defaultEnterPressedAction = getActionMap().get(ENTER_PRESSED);
      Action a = new AbstractAction() {
        @Override public void actionPerformed(ActionEvent e) {
          boolean isPopupVisible = isPopupVisible();
          setPopupVisible(false);
          DefaultComboBoxModel<String> m = (DefaultComboBoxModel<String>) getModel();
          String str = Objects.toString(getEditor().getItem(), "");
          if (m.getIndexOf(str) < 0) {
            m.removeElement(str);
            m.insertElementAt(str, 0);
            if (m.getSize() > 10) {
              m.removeElementAt(10);
            }
            setSelectedIndex(0);
            setPopupVisible(isPopupVisible);
          } else {
            defaultEnterPressedAction.actionPerformed(e);
          }
        }
      };
      getActionMap().put(ENTER_PRESSED, a);
      

参考リンク

コメント