Swing/DisableItemComboBox の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/DisableItemComboBox へ行く。
- Swing/DisableItemComboBox の差分を削除
--- category: swing folder: DisableItemComboBox title: JComboBoxのアイテムを選択不可にする tags: [JComboBox, ListCellRenderer, ActionMap, InputMap] author: aterai pubdate: 2008-04-14T13:34:30+09:00 description: JComboBoxのドロップダウンリストで、指定したアイテムを選択不可にします。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTLHzjDYpI/AAAAAAAAAXE/M4bkzWJetUI/s800/DisableItemComboBox.png hreflang: href: https://java-swing-tips.blogspot.com/2010/03/non-selectable-jcombobox-items.html lang: en --- * 概要 [#summary] `JComboBox`のドロップダウンリストで、指定したアイテムを選択不可にします。 #download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTLHzjDYpI/AAAAAAAAAXE/M4bkzWJetUI/s800/DisableItemComboBox.png) * サンプルコード [#sourcecode] #code(link){{ class DisableItemComboBox<E> extends JComboBox<E> { private final Set<Integer> disableIndexSet = new HashSet<>(); private boolean isDisableIndex; private final Action up = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { int si = getSelectedIndex(); for (int i = si - 1; i >= 0; i--) { if (!disableIndexSet.contains(i)) { setSelectedIndex(i); break; } } } }; private final Action down = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { int si = getSelectedIndex(); for (int i = si + 1; i < getModel().getSize(); i++) { if (!disableIndexSet.contains(i)) { setSelectedIndex(i); break; } } } }; public DisableItemComboBox() { super(); } public DisableItemComboBox(ComboBoxModel<E> aModel) { super(aModel); } public DisableItemComboBox(E[] items) { super(items); } @Override public void updateUI() { super.updateUI(); setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component c; if (disableIndexSet.contains(index)) { c = super.getListCellRendererComponent( list, value, index, false, false); c.setEnabled(false); } else { c = super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus); c.setEnabled(true); } return c; } }); ActionMap am = getActionMap(); am.put("selectPrevious3", up); am.put("selectNext3", down); InputMap im = getInputMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "selectPrevious3"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_KP_UP, 0), "selectPrevious3"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "selectNext3"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN, 0), "selectNext3"); } public void setDisableIndex(Set<Integer> set) { disableIndexSet.clear(); for (Integer i: set) { disableIndexSet.add(i); } } @Override public void setPopupVisible(boolean v) { if (!v && isDisableIndex) { isDisableIndex = false; } else { super.setPopupVisible(v); } } @Override public void setSelectedIndex(int index) { if (disableIndexSet.contains(index)) { isDisableIndex = true; } else { //isDisableIndex = false; // isDisableIndex = false; super.setSelectedIndex(index); } } } }} * 解説 [#explanation] 上記のサンプルでは、以下の方法でドロップダウンリストの特定のアイテムを選択できないように設定しています。 - アイテムの表示 -- セルレンダラーで`setEnabled(false)`などを設定 - アイテムの選択不可 -- `setSelectedIndex(...)`メソッドをオーバーライド - 選択不可アイテムのクリックを無視 -- `setPopupVisible(...)`メソッドをオーバーライドして、ポップアップを閉じないよう設定 - 選択不可アイテムのキー操作を無視 -- カーソルキーなどの操作で選択不可アイテムをスキップする`ActionMap`、`InputMap`を設定 * 参考リンク [#reference] - [[JListの任意のItemを選択不可にする>Swing/DisabledItem]] * コメント [#comment] #comment #comment