• category: swing folder: ComboBoxDropdownSelection title: JComboBoxで編集した文字列をドロップダウンリストで選択する tags: [JComboBox, JPopupMenu, PopupMenuListener] author: aterai pubdate: 2015-12-28T00:09:10+09:00 description: JComboBoxで編集した後の文字列がドロップダウンリスト中に存在する場合、そのアイテムを選択するように設定します。 image: https://lh3.googleusercontent.com/-EomuM0qaNtw/Vn_-BRt08_I/AAAAAAAAOJ0/hrUTPDKhroE/s800-Ic42/ComboBoxDropdownSelection.png

概要

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) {}
  @Override public void popupMenuCanceled(PopupMenuEvent e) {}
}
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 defalutEnterPressedAction = 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 {
            defalutEnterPressedAction.actionPerformed(e);
          }
        }
      };
      getActionMap().put(ENTER_PRESSED, a);
      

コメント