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: 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

概要

JListの任意のItemを選択不可にするListCellRendererを設定します。

概要

JListの任意のItemを選択不可にするようなレンダラーを設定します。
http://terai.xrea.jp/swing/disableditem/screenshot.png

サンプルコード

#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)として返す
  • UpDownキーでJListのアイテムの選択を移動する場合、選択不可にしたアイテムを飛ばすようにselectNextRowなどのアクションを変更

コメント

参考リンク

コメント