使用JList更改特定索引的颜色

时间:2014-01-03 16:24:14

标签: java swing colors jlist listcellrenderer

如何使用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,我想根据它们的值更改颜色。

2 个答案:

答案 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

中唯一需要的用户代码