Swing/DisableItemComboBox のバックアップの現在との差分(No.1)
TITLE:JComboBoxのアイテムを選択不可にする
JComboBoxのアイテムを選択不可にする
Posted by terai at 2008-04-14-
category: swing
folder: DisableItemComboBox
title: JComboBoxのアイテムを選択不可にする
tags: [JComboBox, ListCellRenderer, ActionMap, InputMap]
author: aterai
pubdate: 2008-04-14T13:34:30+09:00
description: JComboBoxのドロップダウンリストで、指定したアイテムを選択不可にします。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2010/03/non-selectable-jcombobox-items.html lang: en
概要
JComboBox
のドロップダウンリストで、指定したアイテムを選択不可にします。
Screenshot
Advertisement
概要
JComboBoxのドロップダウンリストで、指定したアイテムを選択不可にします。サンプルコード
#spanend
#spanadd
class DisableItemComboBox<E> extends JComboBox<E> {
#spanend
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;
}
}
}
};
-&jnlp;
-&jar;
-&zip;
public DisableItemComboBox() {
super();
}
#spandel
#screenshot
#spanend
public DisableItemComboBox(ComboBoxModel<E> aModel) {
super(aModel);
}
#spandel
**サンプルコード [#eb0a9dc4]
#spanend
#spandel
#code{{
#spanend
#spandel
class MyComboBox extends JComboBox {
#spanend
public MyComboBox() {
super();
final ListCellRenderer r = getRenderer();
setRenderer(new ListCellRenderer() {
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
public DisableItemComboBox(E[] items) {
super(items);
}
#spanadd
#spanend
@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 = r.getListCellRendererComponent(list,value,index,false,false);
if (disableIndexSet.contains(index)) {
c = super.getListCellRendererComponent(
list, value, index, false, false);
c.setEnabled(false);
}else{
c = r.getListCellRendererComponent(list,value,index,isSelected,cellHasFocus);
} else {
c = super.getListCellRendererComponent(
list, value, index, isSelected, cellHasFocus);
c.setEnabled(true);
}
return c;
}
});
Action up = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
int si = getSelectedIndex();
for(int i = si-1;i>=0;i--) {
if(!disableIndexSet.contains(i)) {
setSelectedIndex(i);
break;
}
}
}
};
Action down = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
int si = getSelectedIndex();
for(int i = si+1;i<getModel().getSize();i++) {
if(!disableIndexSet.contains(i)) {
setSelectedIndex(i);
break;
}
}
}
};
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_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");
}
private final HashSet<Integer> disableIndexSet = new HashSet<Integer>();
private boolean isDisableIndex = false;
public void setDisableIndex(HashSet<Integer> set) {
#spanadd
#spanend
public void setDisableIndex(Set<Integer> set) {
disableIndexSet.clear();
for(Integer i:set) {
for (Integer i: set) {
disableIndexSet.add(i);
}
}
@Override
public void setPopupVisible(boolean v) {
if(!v && isDisableIndex) {
#spanadd
#spanend
@Override public void setPopupVisible(boolean v) {
if (!v && isDisableIndex) {
isDisableIndex = false;
}else{
} else {
super.setPopupVisible(v);
}
}
@Override
public void setSelectedIndex(int index) {
if(disableIndexSet.contains(index)) {
#spanadd
#spanend
@Override public void setSelectedIndex(int index) {
if (disableIndexSet.contains(index)) {
isDisableIndex = true;
}else{
//isDisableIndex = false;
} else {
// isDisableIndex = false;
super.setSelectedIndex(index);
}
}
}
View in GitHub: Java, Kotlin解説
解説
上記のサンプルでは、以下の方法でドロップダウンリストの特定のアイテムを選択できないように設定しています。- 表示
- セルレンダラーでsetEnabledなどをを設定
- 選択不可
- setSelectedIndexをオーバーライド
- 選択不可アイテムをクリックしてもポップアップを閉じない
- setPopupVisibleをオーバーライド
- キー操作で選択不可アイテムを無視
- ActionMap、InputMapの設定
- アイテムの表示
- セルレンダラーで
setEnabled(false)
などを設定
- セルレンダラーで
- アイテムの選択不可
-
setSelectedIndex(...)
メソッドをオーバーライド
-
- 選択不可アイテムのクリックを無視
-
setPopupVisible(...)
メソッドをオーバーライドして、ポップアップを閉じないよう設定
-
- 選択不可アイテムのキー操作を無視
- カーソルキーなどの操作で選択不可アイテムをスキップする
ActionMap
、InputMap
を設定
- カーソルキーなどの操作で選択不可アイテムをスキップする