1

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

4

2 回答 2

6

列表中的值包含 COMPLETED 或 INCOMPLETE,我想根据它们的值更改它们的颜色。

首先,没有必要保留这三个列表:

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

查看如何使用列表跟踪中的编写自定义单元格渲染器部分以获取更多详细信息。

于 2014-01-03T16:51:30.900 回答
1

您正在为每个列表组件设置前景色,但getListCellRendererComponent在渲染每个单独的单元格时会被调用。在这种情况下,您需要执行类似的操作

if (value.toString().contains("COMPLETED")) {
    setForeground(Color.GREEN);
} else if (value.toString().contains("INCOMPLETE")) {
    setForeground(Color.RED);           
} else {   // handle default case
   ...
}   

这是唯一需要的用户代码ListRenderer

于 2014-01-03T16:51:13.277 回答