2016-12-02 11 views
0

меня JComboBox где я применяю ListCellRenderer следующим образом:ListCellRenderer, выбранное значение не виден

colorList = new JComboBox<>(COLORS_NAMES); 
    ColorComboBoxRenderer renderer = new ColorComboBoxRenderer(colorList); 
    renderer.setColors(COLORS); 
    renderer.setColorNames(COLORS_NAMES); 
    colorList.setRenderer(renderer); 

это приводит к модифицирующему клеток, но я не могу найти причину, почему выбранное значение запоминается, но не на фото. Как следующее:

enter image description here

Вот мой код для визуализатора (опуская setColors, getColors и т.д ..)

class ColorComboBoxRenderer extends JPanel implements ListCellRenderer{ 

    JPanel textPanel; 
    JLabel text; 

    public ColorComboBoxRenderer(JComboBox combo){ 
     textPanel = new JPanel(); 
     textPanel.add(this); 
     text = new JLabel(); 
     text.setOpaque(true); 
     text.setFont(combo.getFont()); 
     textPanel.add(text); 
    } 

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, 
      boolean cellHasFocus) { 
     if (isSelected){ 
      list.setSelectionBackground(colors[list.getSelectedIndex()]); 
     } 
     else{} 

     if(colors.length != colorNames.length){ 
      System.out.println("colors.length doesn't match colorNames.length"); 
      return this; 
     } 
     else if(colors == null){ 
      System.out.println("Set colors by setColors first."); 
      return this; 
     } 
     else if(colorNames == null){ 
      System.out.println("Set colorNames by setColorNames first."); 
      return this; 
     } 

     text.setText(" "); 

     if(index > -1){ 
      text.setBackground(colors[index]); 
      text.setText(" "); 
     } 

     return text; 
    } 
} 

Что же меня смущает то, что if(isSelected) block делается каждый раз, когда я указываю курсор на указанную ячейку , но моя интуиция скорее предпочла бы, что это произойдет, когда cellHasFocus param является истинным.

Спасибо заранее, как я борюсь с ней с 2-х дней;/

EDIT 1

Добавлено JComboBox поле класса ColorComboBoxRenderer и инициализирует его в конструкторе:

private JComboBox comboBox; 
public ColorComboBoxRenderer(JComboBox combo) { 
     this.comboBox = combo; 
     //rest of code as it was 
    } 

Изменены что:

if(isSelected){ 
     list.setSelectionBackground(colors[list.getSelectedIndex()]); 
    } 

Кому:

if (isSelected){ 
     list.setSelectionBackground(colors[list.getSelectedIndex()]); 
     comboBox.setBackground(colors[list.getSelectedIndex()]); 
    } 

Результаты в:

enter image description here

Теперь эффект лучше, так что, может быть, и есть идеи, как изменить JComboBox фон, но не влияют на стрелку вниз в списке?

ответ

0

В редакторе 1 важно, чтобы мы редактировали ComboBox, это необходимо, потому что ListRenderer просто создает список DropDown и его ячейки, но не влияет на поля ComboBox. Итак, что было необходимо, и я, наконец, нашел его, был довольно грубым подходом. Я изменил весь фон ComboBox, когда был выбран как в EDIT 1, но затем возвратил состояние стрелки, которое находится в индексе (0) JComboBox. Наконец, что часть кода должна выглядеть так:

 if (isSelected){ 
      list.setSelectionBackground(colors[list.getSelectedIndex()]); 
      comboBox.setBackground(colors[list.getSelectedIndex()]); 
      comboBox.getComponent(0).setBackground(new JButton().getBackground()); 
     } 

Теперь все работает как задумано:

enter image description here