如何使用JList更改特定索引的颜色,我设法更改颜色,但它会更改整个列表的颜色,我需要能够将特定索引更改为一种颜色,另一种索引到另一个。
我尝试了很多组合,它们似乎只改变整个列表颜色而不是索引。我理解为什么因为它指的是整个列表,我只是不知道如何为特定索引更改它。
m.aList.setCellRenderer(new MyCellRender());
private class MyCellRender extends DefaultListCellRenderer
{
public Component getListCellRendererComponent( JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus )
{
super.getListCellRendererComponent( list, value, index,
isSelected, cellHasFocus );
ArrayList<Object> values = new ArrayList<>();
ArrayList<String> complete = new ArrayList<>();
ArrayList<String> incomplete = new ArrayList<>();
for (int i = 0; i < list.getModel().getSize(); i++) {
values.add(list.getModel().getElementAt(i));
}
for (Object o : values) {
if (o.toString().contains("COMPLETED")) {
complete.add(o.toString());
}
if (o.toString().contains("INCOMPLETE")) {
incomplete.add(o.toString());
}
}
for (String s : complete) {
setForeground(Color.green);
}
for (String s1 : incomplete) {
setForeground(Color.red);
}
return( this );
}
}
列表中的值包含COMPLETED或INCOMPLETE,我想根据它们的值更改颜色。
答案 0 :(得分:6)
列表中的值包含COMPLETED或INCOMPLETE和I. 我想根据价值改变颜色。
首先,没有必要保留这三个列表:
ArrayList<Object> values = new ArrayList<>();
ArrayList<String> complete = new ArrayList<>();
ArrayList<String> incomplete = new ArrayList<>();
为ListCellRenderer中的每个元素评估JList组件,因此这些列表毫无意义。您可以按照以下方式轻松实现您的要求:
private class MyCellRender extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if(value.toString().contains("INCOMPLETE") || value.toString().contains("COMPLETED")) {
Color fg = value.toString().contains("COMPLETED") ? Color.green : Color.red;
setForeground(fg);
} else {
setForeground(list.getForeground());
}
return this;
}
}
请查看Writing a Custom Cell Renderer小道中的How to Use Lists部分,了解更多详情。
答案 1 :(得分:1)
您为每个列表组件设置前景色,但在渲染每个单独的单元格时调用getListCellRendererComponent
。在这种情况下,您需要执行类似
if (value.toString().contains("COMPLETED")) {
setForeground(Color.GREEN);
} else if (value.toString().contains("INCOMPLETE")) {
setForeground(Color.RED);
} else { // handle default case
...
}
这是ListRenderer