JListの任意のItemを選択不可にする
Total: 10177
, Today: 2
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JList
の任意のItem
を選択不可にするListCellRenderer
を設定します。
Screenshot
Advertisement
サンプルコード
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)
として返す - Up、Downキーで
JList
のアイテムの選択を移動する場合、選択不可にしたアイテムを飛ばすようにselectNextRow
などのアクションを変更