Swing/DisabledItem のバックアップの現在との差分(No.2)
JListの任意のItemを選択不可にする
編集者:Terai Atsuhiro~
作成日:2005-05-30
更新日:2023-03-09 (木) 18:58:30
- category: swing folder: DisabledItem title: JListの任意のItemを選択不可にする tags: [JList, ListCellRenderer, ActionMap] author: aterai pubdate: 2005-05-30T09:46:59+09:00 description: JListの任意のItemを選択不可にするListCellRendererを設定します。 image: hreflang:
href: https://java-swing-tips.blogspot.com/2017/04/disable-any-items-in-jlist.html lang: en
概要
JList
の任意のItem
を選択不可にするListCellRenderer
を設定します。
概要
JListの任意のItemを選択不可にするようなレンダラーを設定します。Screenshot
Advertisement
サンプルコード
#spanend
#spanadd
JList<String> list = new JList<>(model);
#spanend
#spanadd
list.setCellRenderer(new DefaultListCellRenderer() {
#spanend
@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);
}
return c;
}
#spanadd
});
#spanend
#spandel
**サンプルコード [#we6e9a24]
#spanend
class MyCellRenderer1 extends DefaultListCellRenderer {
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
if(index==1) {
Component c = super.getListCellRendererComponent(list,value,index,
false,false);
c.setEnabled(false);
return c ;
}else{
return super.getListCellRendererComponent(list,value,index,
isSelected,cellHasFocus) ;
}
}
}
class MyCellRenderer2 extends DefaultListCellRenderer {
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
if(index<3 || index>7 || index==5) {
Component c = super.getListCellRendererComponent(list,value,index,
false,false);
c.setEnabled(false);
return c ;
}else{
return super.getListCellRendererComponent(list,
value,
index,
isSelected,
cellHasFocus) ;
}
}
}
#spanadd
ActionMap am = list.getActionMap();
#spanend
#spanadd
am.put("selectNextRow", new AbstractAction() {
#spanend
@Override public void actionPerformed(ActionEvent ae) {
for (int i = list.getSelectedIndex() + 1; i < list.getModel().getSize(); i++) {
if (!disableIndexSet.contains(Integer.valueOf(i))) {
list.setSelectedIndex(i);
break;
}
}
}
#spanadd
});
#spanend
#spanadd
View in GitHub: Java, Kotlin解説
上記のサンプルでは、レンダラーを切り替えることでItemの選択可、不可の状態を切り替えています。解説
-
JList
のアイテムの選択可・不可はリストセルレンダラーのListCellRenderer#getListCellRendererComponent(...)
メソッド中で判断する - インデックスが選択不可の場合オリジナルのリストセルレンダラーから選択無し、かつフォーカス無しのコンポーネントを取得し、さらに
setEnabled(false)
として返す - Up、Downキーで
JList
のアイテムの選択を移動する場合、選択不可にしたアイテムを飛ばすようにselectNextRow
などのアクションを変更