# Hintergrundfarbe der JComboBox



## BlubBlub (15. Sep 2011)

Hi ich habe eine JComboBox erstellt.
In der ComboBox sind Elemente mit den Bezeichnungen:
"One"
"Two"
"Three"
"Four"
drin. Klappt man die ComboBox auf so werden das Element "Two" und "Four" in grauer Schrift 
angezeigt. Die Elemente "One" und "Three" in schwarzer Schrift.
Fährt man mit dem Mauszeiger über die Elemente "Two" und Four" so ist die Textfarbe weiß und der
Hintergrund grau.
Fährt man mit dem Mauszeigen über die Elemente "One" und "Three" so ist die Schriftfarbe weiß und der Hintergrund blau.
Soweit so gut.
Aber wähle ich ein Element aus so ist der Hintergrund in Hauptanzeigefenster weiß. Genauer gesagt er ist immer weiß, anstatt grau, so wie es sein sollte wenn man comboBox.setEditable(false); gesetzt hat und keinen eigenen ListCellRenderer verwendet.
Wie kriege ich es hin dass das der Hauptanzeige Bereich der JComboBox immer eine graue Hintergrundfarbe hat und nicht wie momentan weiß?
Achtung: Die Hintergrundfarbe soll nicht einfach nur Hellgrau sein, sondern auch diesen drei Dimensionalen Effekt der sich aus einem hellen in der oberen Anzeigehälfte und einem dunklen Grau Ton in der unteren Anzeigehälfte ergibt. Der Aufruf 		comboBox.setBackground(Color.LIGHT_GRAY); ist also keine Lösung.


```
JComboBox comboBox = new JComboBox();
comboBox.setMaximumRowCount(5);
comboBox.setRenderer(new LabelListCellRenderer());
comboBox.setEditable(false);

ListValue one = new ListValue("One");
ListValue two = new ListValue("Two");
ListValue three = new ListValue("Three");
ListValue four = new ListValue("Four");

two.setTextValueColor(Color.GRAY);
four.setTextValueColor(Color.GRAY);

comboBox.addItem(one);
comboBox.addItem(two);
comboBox.addItem(three);
comboBox.addItem(four);
```


```
public class LabelListCellRenderer extends JLabel implements ListCellRenderer 
{

	@Override
	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
	{
		ListValue listValue = (ListValue)value;
		this.setText(listValue.getTextValue());

//ACHTUNG: Setze ich diesen Wert auf false, so habe ich die erwünschte 
//graue dreidimensionale Hintergrundfarbe im Hauptanzeigebereich der
// JComboBox allerinds sieht man dann beim Überfahren der einzelnen Auswahl
// Elemente nicht mehr den blauen bzw. Grauen Hintergrundbalken
		this.setOpaque(true); 

	    if(isSelected)
	    {
	        this.setForeground(UIManager.getColor("List.selectionForeground"));   
	        
	        if(listValue.getTextValueColor().equals(Color.GRAY))
	        	 this.setBackground(listValue.getTextValueColor());
	        else this.setBackground(UIManager.getColor("List.selectionBackground"));
	       
	    }
	    else
	    {
	    	this.setForeground(listValue.getTextValueColor());
	        this.setBackground(UIManager.getColor("List.background"));
	    }
		return this;
	}

}
```


```
public class ListValue
{
	private String textValue;
	private Color textValueColor;

	public ListValue(String textValue)
	{
	    this.textValue = textValue;
	    this.textValueColor = Color.BLACK;
	}
	  
	public String getTextValue()
	{
	    return textValue;
	}
	
	public void setTextValue(String textValue)
	{
		this.textValue = textValue;
	}
	
	public Color getTextValueColor() 
	{
	    return textValueColor;
	}
	  
	public void setTextValueColor(Color textValueColor) 
	{
	    this.textValueColor = textValueColor;
	}

	@Override
	public String toString()
	{
		return this.textValue;
	}
}
```




An diesen beiden Seiten habe ich mich übrigens orientiert.
Der erste Link bezieht sich auf eine JList der zweite auf eine JComboBox.
Java Schriftfarbe in JList ändern :: Ein Karlsruher Bloggt!
Java CodeGuru: (none)


----------



## Michael... (15. Sep 2011)

Genauso wie Du mit dem Renderer die Einträge der Dropdownliste einfärbst musst Du einen Editor schreiben, der sich entsprechend dem ausgewählten Eintrag umfärbt.
Stichwort ComboBoxEditor


----------



## BlubBlub (15. Sep 2011)

Na aber ich möchte gar nicht dass sich der Hauptanzeige Bereich umfärbt. Ich möchte einfach, dass der Hauptanzeige Bereich immer die Hintergrundfarbe hat, die man hat, wenn man keinen eigenen Renderer verwendet und comboBox.setEditable(false) setzt.
Zudem ist das ja keine eine spezielle Farbe sondern es sind zwei übereinander liegende Grautöne, die jeweils die hälfte des Hauptanzeigebereichs einnehmen und für den dreidimensionalen Effekt sorgen.

Was ich herausgefundent habe:  Wenn ich im selbstegeschriebenen CellRenderer setOpaque(false) setze, dann hab ich auch die gewünschte Hintergrundfarbe.
Allerdings, hab ich dann beim Überfahren der aufgeklappten Liste keinen Balken mehr, dazu muss setOpaque(true) sein.


----------



## Michael... (15. Sep 2011)

BlubBlub hat gesagt.:


> Na aber ich möchte gar nicht dass sich der Hauptanzeige Bereich umfärbt. Ich möchte einfach, dass der Hauptanzeige Bereich immer die Hintergrundfarbe hat, die man hat, wenn man keinen eigenen Renderer verwendet und comboBox.setEditable(false) setzt.
> Zudem ist das ja keine eine spezielle Farbe sondern es sind zwei übereinander liegende Grautöne, die jeweils die hälfte des Hauptanzeigebereichs einnehmen und für den dreidimensionalen Effekt sorgen.


Wozu dann das ganze mit dem Renderer? Kein Wunder, dass ich das wesentliche überlesen habe ;-)

Das hört sich nach einer spezifischen Darstellung des LaF an. Bei mir schaut eine ComboBox nämlich anders aus.
Eventuell wird das gar nicht so einfach machbar sein, da man vermutlich ins LaF eingreifen müsste.


----------

