• 追加された行はこの色です。
  • 削除された行はこの色です。
#navi(../)
*JListの任意のItemを選択不可にする [#n20fb52b]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-05-30~
更新日:&lastmod;
---
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: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTLAYVmo3I/AAAAAAAAAW4/3MUtTm4ixyo/s800/DisabledItem.png
hreflang:
    href: https://java-swing-tips.blogspot.com/2017/04/disable-any-items-in-jlist.html
    lang: en
---
* 概要 [#summary]
`JList`の任意の`Item`を選択不可にする`ListCellRenderer`を設定します。

#contents
**概要 [#lbedb56b]
JListの任意のItemを選択不可にするようなレンダラーを設定します。
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTLAYVmo3I/AAAAAAAAAW4/3MUtTm4ixyo/s800/DisabledItem.png)

http://terai.xrea.jp/swing/disableditem/screenshot.png
* サンプルコード [#sourcecode]
#code(link){{
JList<String> list = new JList<>(model);
list.setCellRenderer(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);
    }
    return c;
  }
});

**サンプルコード [#we6e9a24]
 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) ;
     }
   }
 }
ActionMap am = list.getActionMap();
am.put("selectNextRow", new AbstractAction() {
  @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;
      }
    }
  }
});
}}

-[[サンプルを起動>http://terai.xrea.jp/swing/disableditem/sample.jnlp]]
-[[jarファイル>http://terai.xrea.jp/swing/disableditem/sample.jar]]
-[[ソース>http://terai.xrea.jp/swing/disableditem/src.zip]]
* 解説 [#explanation]
- `JList`のアイテムの選択可・不可はリストセルレンダラーの`ListCellRenderer#getListCellRendererComponent(...)`メソッド中で判断する
- インデックスが選択不可の場合オリジナルのリストセルレンダラーから選択無し、かつフォーカス無しのコンポーネントを取得し、さらに`setEnabled(false)`として返す
- KBD{Up}、KBD{Down}キーで`JList`のアイテムの選択を移動する場合、選択不可にしたアイテムを飛ばすように`selectNextRow`などのアクションを変更

**解説 [#w70ba780]
上記のサンプルでは、index==1のItemの場合、常に選択もフォーカスも無く、かつsetEnabled(false)となるようなレンダラーを設定しています。
* 参考リンク [#reference]
- [[JComboBoxのアイテムを選択不可にする>Swing/DisableItemComboBox]]

//**参考リンク
**コメント [#b2e67b98]
* コメント [#comment]
#comment
#comment