• category: swing folder: DisabledItem title: JListの任意のItemを選択不可にする tags: [JList, ListCellRenderer, ActionMap] author: aterai pubdate: 2005-05-30T09:46:59+09:00 description: JListの任意のItemを選択不可にするようなレンダラーを設定します。 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を選択不可にするようなレンダラーを設定します。

サンプルコード

final JList = new JList();
final ListCellRenderer r = list.getCellRenderer();
final Vector disableIndexSet = new Vector();
initDisableIndex(disableIndexSet);
list.setCellRenderer(new ListCellRenderer() {
  @Override public Component getListCellRendererComponent(JList list, Object value,
                   int index, boolean isSelected, boolean cellHasFocus) {
    Component c;
    if (disableIndexSet.contains(Integer.valueOf(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() {
  @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;
      }
    }
  }
});
View in GitHub: Java, Kotlin

解説

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

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

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

参考リンク

コメント