TITLE:JListの任意のItemを選択不可にする

JListの任意のItemを選択不可にする

Posted by terai at 2005-05-30

概要

JListの任意のItemを選択不可にするようなレンダラーを設定します。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

final JList = new JList();
final ListCellRenderer r = list.getCellRenderer();
final Vector disableIndexSet = new Vector();
initDisableIndex(disableIndexSet);
list.setCellRenderer(new ListCellRenderer() {
  public Component getListCellRendererComponent(JList list, Object value,
                   int index, boolean isSelected, boolean cellHasFocus) {
    Component c;
    if(disableIndexSet.contains(new Integer(index))) {
      c = r.getListCellRendererComponent(list,value,index,false,false);
      c.setEnabled(false);
    }else{
      c = r.getListCellRendererComponent(list,value,index,isSelected,cellHasFocus);
    }
    return c;
  }
});
ActionMap am = list.getActionMap();
am.put("selectNextRow", new AbstractAction() {
  public void actionPerformed(ActionEvent ae) {
    int index = list.getSelectedIndex()+1;
    for(int i=index;i<list.getModel().getSize();i++) {
      if(!disableIndexSet.contains(new Integer(i))) {
        list.setSelectedIndex(i);
        break;
      }
    }
  }
});

解説

上記のサンプルでは、カンマ区切りで入力したインデックスのアイテムを選択不可にすることができます。

選択可か不可かはセルレンダラー中で判断しています。このセルレンダラーでは、インデックスが選択不可の場合、オリジナルのセルレンダラーから選択無し、フォーカス無しのコンポーネントを取得し、さらにsetEnabled(false)として返しています。

また、上下キーでアイテムの選択を移動する場合、選択不可にしたアイテムを飛ばすように、selectNextRowなどのアクションを変更しています。

コメント