概要

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

サンプルコード

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;
  }
});

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のアイテムの選択可・不可はリストセルレンダラーのListCellRenderer#getListCellRendererComponent(...)メソッド中で判断する
  • インデックスが選択不可の場合オリジナルのリストセルレンダラーから選択無し、かつフォーカス無しのコンポーネントを取得し、さらにsetEnabled(false)として返す
  • UpDownキーでJListのアイテムの選択を移動する場合、選択不可にしたアイテムを飛ばすようにselectNextRowなどのアクションを変更

参考リンク

コメント