• title: JComboBoxで編集した文字列をドロップダウンリストで選択する tags: [JComboBox, JPopupMenu, PopupMenuListener] author: aterai pubdate: 2015-12-28T00:09:10+09:00 description: JComboBoxで編集した後の文字列がドロップダウンリスト中に存在する場合、そのアイテムを選択するように設定します。

概要

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);

コメント