2014-01-03 3 views
0

Как изменить цвет определенного индекса с помощью JList, мне удается изменить цвет, но он меняет цвет всего списка, и мне нужно иметь возможность изменять конкретный индекс индекс к одному цвету, а другой - к другому.Изменение цвета конкретного индекса с помощью 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); 
    } 
} 

Значения в списке содержат либо ЗАВЕРШЕНА или неполно, и я хотел бы изменить свой цвет в зависимости от их стоимости.

+0

Посмотрите на 'ListCellRenderers' – Reimeus

+0

Я использую ListCellRenderer, это фрагмент кода, который я пытаюсь использовать для изменения цвета, однако он меняет цвет всего списка вместо индекса Я хочу, чтобы – user1848712

+1

затем опубликовал полный 'SSCCE' вашего кода, чтобы показать, как эта проблема возникает. – Reimeus

ответ

5

Значения в списке содержат либо ЗАВЕРШЕНА или неполно, и я хотел бы изменить их цвет в соответствии с их значением.

Во-первых, нет никакой необходимости, чтобы эти три списка:

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 следе для получения более подробной информации.

+0

Спасибо большое, не очень-то разбираюсь в том, как работают рендеринги ячеек, поэтому я буду читать на нем – user1848712

+0

@ user1848712 добро пожаловать! Взгляните на [эту тему] (http://stackoverflow.com/a/13673083/1795530), чтобы лучше понять, как работают рендеринги Swing. – dic19

1

Вы устанавливаете цвет переднего плана для каждого компонента списка, но при рендеринге каждой отдельной ячейки вызывается getListCellRendererComponent. В этом случае вам нужно сделать что-то вроде

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

Это единственный код пользователя необходимо в ListRenderer

Смежные вопросы