# jCombobox addItem funktioniert nicht



## Bender (26. Jan 2012)

Hallo,

ich habe ein seltsames Problem und weiß leider nicht, woran es liegt.

Da ich eine gewisse Combobox mehrfach verwende habe ich dafür eine eigene Klassen angelegt.

```
public class MyCombo extends JComboBox
```

Dort ist nur noch ein Renderer definiert.

diese Combobox wird zum einen in JTables benutzt, aber auch direkt auf der Oberfläsche.


```
JComboBox box1 = new MyCombo(data);
```

füge ich nun in meinen Datensatz ein Element hinzu sollen alle JCombos neu geladen werden.
in den JTables funktioniert dies ohne Probleme, jedoch in der box1 nicht.

habe sowohl folgendes versucht:

```
box1 = new MyCombo(data);
```
als auch

```
box1.addItem(item)
```

Jedoch ändert sich dort nichts.

Hat jemand eine Idee, woran es liegen könnte?

Gruß
Bender


----------



## Gast2 (26. Jan 2012)

Wie schaut denn deine MyCombo klasse aus? Was hast du da alles überschrieben?


----------



## Bender (26. Jan 2012)

In der MyCombo habe ich lediglich den konstruktor, der schaut wie folgt aus:


```
MyCombo(MyData data){
    this.data=data;
    for(int i=0;i<data.getlength();i++){
        this.addItem(data.getID(i))
    }
        this.setRenderer(new ListCellRenderer() {

            protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if(value instanceof Integer){
                        renderer.setText(data.getText((Integer)value));
                }else
                    renderer.setText(value.toString());
                return renderer;
            }
        });
}
```


----------



## HimBromBeere (27. Jan 2012)

Ich weiß nicht, inwiefern das Folgende verwerflich ist, aber ich persönlich finde das Implementieren von Listener-Klassen in Konstruktoren sehr hässlich. Der Listener hat ja persé erstmal nichts mit der Klasse selbst zu tun, sondern mit den Instanzen, die du davon erzeugst.
Berichtigt mich, wenn ich falsch liege...

EDIT: Zum Fehler? Bekommst du irgendwelche Exceptions um die Ohren geworfen? Vlcht. übersiehst du sie auch einfach, weil du irgendwo ´nen leeren catch()-Block hast?


----------



## xehpuk (27. Jan 2012)

Führst du das 
	
	
	
	





```
addItem()
```
 auf dem EDT aus?

Warum extendierst du nicht gleich DefaultListCellRenderer? Das mit dem Member sieht merkwürdig aus.



HimBromBeere hat gesagt.:


> Ich weiß nicht, inwiefern das Folgende verwerflich ist, aber ich persönlich finde das Implementieren von Listener-Klassen in Konstruktoren sehr hässlich. Der Listener hat ja persé erstmal nichts mit der Klasse selbst zu tun, sondern mit den Instanzen, die du davon erzeugst.


Von welchem Listener redest du? An sich verstehe ich die Aussage auch nicht ganz.


----------



## bERt0r (27. Jan 2012)

Du machst da was grundlegendes falsch: Ein Renderer soll die Daten, die ihm übergeben werden in einer bestimmten Art und Weise anzeigne. Es ist NICHT Aufgabe des Renderers, wie in deinem Fall, eine Id (Nummer) zu einem anderen Objekt (String) zuzuordnen. Ein Renderer sollte nur die Daten, die ihm per value Parameter übergeben werden anzeigen.
Wenn du in deiner ComboBox ein Mapping zwischen zwei Eigenschaften eines Objekts vornehmen willst, kannst du problemlos das ganze Objekt in die ComboBox packen. Falls du keinen Renderer verwenden willst, musst du dann einfach die toString Methode deines Objekts überschreiben, falls du einen Renderer verwenden willst, kannst du dann eben die Anzeige genau auf dein Objekt spezifizieren.


----------



## Bender (27. Jan 2012)

ok, mit dem renderer habt ihr natürlich recht. habe ihn jetzt aber mal komplett entfernt.
ändert jedoch immer noch nichts.
was mich sehr wunder, wenn ich mein Programm debugge, werden die nachträglich eingefügten Elemente als Element in der Combobox angezeigt, also box1 kennt das neue Element, es wird nur nicht auf der Oberfläche dargestellt.


----------



## Michael... (27. Jan 2012)

Ich kann in den bisherigen Informationen keinen Grund finden, der es rechtfertigt die Standard JComboBox zu erweitern.
Nichts desto trotzt funktioniert es denn überhaupt, wenn eine JComboBox statt der MyCombo verwendet wird? Eventuell liegt es ja einfach nur daran, dass Du aus Versehen mehrere Instanzen einer ComboBox erstellst, die teilweise gar nicht angezeigt werden und bei Aufruf von addItem() einfach die falsche (nicht sichtbare) Komponente referenzierst.


----------



## bERt0r (27. Jan 2012)

Wie man 2 Comboboxen mit den gleichen Daten anlegt:

```
DefaultComboBoxModel model=new DefaultComboBoxModel();
model.addElement("Hallo");
model.addElement("Welt");
JComboBox box1=new JComboBox(model);
JComboBox box2=new JComboBox(model);
```


----------



## California (27. Jan 2012)

Wenn Du Einträge ändern willst, brauchst Du MutableComboBoxModel


----------

