2016-12-02 4 views
0

Ich habe JComboBox wo ich ListCellRenderer wie gelte:ListCellRenderer, ausgewählter Wert nicht sichtbar

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

es in Modyfing Zellen führen hat, aber ich kann nicht Grund finden, warum ausgewählter Wert in Erinnerung, aber nicht dargestellt. Wie folgt vor:

enter image description here

Hier ist mein Code für Renderer (setColors, getColors etc .. Weglassen)

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

Was mich auch verwirrt ist, dass if(isSelected) block jedes Mal durchgeführt wird I-Punkt Cursor auf bestimmte Zelle , aber meine Intuition würde eher erwarten, dass passiert, wenn cellHasFocus Param wahr ist.

Vielen Dank im Voraus, wie ich mit ihm seit 2 Tagen habe Schwierigkeiten;/

EDIT 1

Added JComboBox Feld ColorComboBoxRenderer Klasse und initialisiert es in Konstruktor:

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

Changed das:

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

An:

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

Ergebnisse in:

enter image description here

nun die Wirkung ist besser, vielleicht u eine Idee, wie JComboBox Hintergrund zu ändern, aber nicht Dropdown-Pfeil aus?

Antwort

0

In EDIT 1 ist es wichtig, dass wir ComboBox bearbeitet haben, ist es notwendig, weil ListRenderer nur DropDown-Liste und seine Zellen generiert, aber ComboBox-Felder nicht beeinflussen würde. Also was war notwendig und ich fand es schließlich, war ziemlich brachiale Annäherung. Ich änderte den gesamten ComboBox-Hintergrund, wenn er wie in EDIT 1 ausgewählt wurde, gab dann aber den Pfeilstatus zurück, der sich bei Index (0) von JComboBox befindet. Schließlich, dass Codeabschnitt so sein sollte:

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

Jetzt funktioniert alles wie geplant:

enter image description here

Verwandte Themen