概要

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 all

解説

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

コメント