Swing/ComboBoxDropdownSelection のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ComboBoxDropdownSelection へ行く。
- 1 (2015-12-28 (月) 00:13:35)
- 2 (2017-06-14 (水) 18:20:43)
- 3 (2018-05-30 (水) 20:11:33)
- 4 (2019-09-06 (金) 18:00:55)
- 5 (2021-05-05 (水) 05:09:29)
- category: swing folder: ComboBoxDropdownSelection title: JComboBoxで編集した文字列をドロップダウンリストで選択する tags: [JComboBox, JPopupMenu, PopupMenuListener] author: aterai pubdate: 2015-12-28T00:09:10+09:00 description: JComboBoxで編集した後の文字列がドロップダウンリスト中に存在する場合、そのアイテムを選択するように設定します。 image:
概要
JComboBox
で編集した後の文字列がドロップダウンリスト中に存在する場合、そのアイテムを選択するように設定します。
Screenshot
Advertisement
サンプルコード
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);