这是一个相当普遍的问题,我使用的解决方案与我后来搜索和发现的类似。一个实现 a ListCellRenderer
,JLabel
它根据当前选定的索引启用或禁用自身:
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
setText(value.toString());
UIDefaults defaults = UIManager.getDefaults();
Color fc;
if (index == 1) {
setEnabled(false);
fc = defaults.getColor("Label.disabledForeground");
setFocusable(false);
} else {
// fc = defaults.getColor("Label.foreground");
fc = list.getForeground();
setEnabled(list.isEnabled());
setFocusable(true);
}
setForeground(fc);
setBackground(isSelected ? list.getSelectionBackground() : list
.getBackground());
return this;
}
问题是即使列表项在视觉上显示为禁用,尽管setFocusable
调用它仍然可以选择。我如何真正禁用它?