• 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();
    JComboBox<?> c = (JComboBox<?>) e.getSource();
    c.setSelectedItem(c.getEditor().getItem());
  }
  @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
  @Override public void popupMenuCanceled(PopupMenuEvent e) {}
#spanadd

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

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

解説

解説

  • Default
    • 123456を編集してaに変更し、ドロップダウンリストを開くと、123456が選択状態
    • "123456"を編集して"a"に変更しドロップダウンリストを開くと"123456"が選択状態になる
  • popupMenuWillBecomeVisible
    • 123456を編集してaに変更し、ドロップダウンリストを開くと、aが選択状態
    • "123456"を編集して"a"に変更しドロップダウンリストを開くと"a"が選択状態になる
    • PopupMenuListenerを追加し、popupMenuWillBecomeVisible(...)メソッドで編集された文字列がドロップダウンリストに存在する場合は選択する
    • ドロップダウンリストを開いたときに編集後の文字列がリストに存在しない場合は、選択状態はクリアされる
    • ドロップダウンリストを開いたときに編集後の文字列がリストに存在しない場合は選択状態がクリアされる
  • +enterPressed Action
    • 123456を編集して123456aに変更し{Enter}、次に文字列をaに変更してから、ドロップダウンリストを開くと、リストに123456aが追加され、aが選択状態
    • {Enter}を押した場合、アイテムを追加するアクションをActionMapに追加
  • "123456"を編集して"123456a"に変更しEnter、次に文字列を"a"に変更してからドロップダウンリストを開くと、リストに"123456a"が追加され"a"が選択状態になる
  • Enterキーを押した場合、アイテムを追加するアクションをActionMapに追加
    #spandel
    Action defalutEnterPressedAction = getActionMap().get(ENTER_PRESSED);
    #spanend
    #spanadd
    Action defaultEnterPressedAction = getActionMap().get(ENTER_PRESSED);
    #spanend
    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);
          defaultEnterPressedAction.actionPerformed(e);
        }
      }
    };
    getActionMap().put(ENTER_PRESSED, a);
    

コメント

参考リンク

コメント