# DefaultComboBoxModel



## shadow (10. Jul 2008)

Hallo,

ich will mir eine eigene ComboBox bauen, mit einem enthaltenen DefaultComboBoxModel. Der Code dazu sieht folgendermaßen aus:


```
public class JTestComboBox extends JComboBox {

        private MyComboBoxModel model;

        public JTestComboBox() {

            // model
            model = new MyComboBoxModel();
            setModel(model);

            // listener
            addActionListener(this);

        }


        private class MyComboBoxModel extends DefaultComboBoxModel {

            private List<String> entries;
            private String selectedEntry;

            public MyComboBoxModel() {


                // lists
                entries = new ArrayList<String>();

                // add fields
                entries.add("A");
                entries.add("B");
                entries.add("C");
                entries.add("D");

                selectedEntry = entries.get(0);

            }

            @Override
            public Object getElementAt(int index) {

                return entries.get(index);
                
            }

            @Override
            public int getSize() {
                return entries.size();
            }

            @Override
            public void setSelectedItem(Object anObject) {
                
                selectedEntry = (String)anObject;
                System.out.println("setSelectedItem: " + selectedEntry);
                
            }
            
            @Override
            public Object getSelectedItem() {
                
                return selectedEntry;
                
            }

        }    

    
    }
```

Komischerweise steht am Anfang in der ComboBox "A" drin, soll ja auch so sein. Nur wenn ich einen anderen Wert auswähle, ist die ComboBox danach leer. Es liegt daran, dass die Methode "setSelectedItem" zweimal aufgerufen wird. Einmal mit dem richten Wert, beispielsweise "C", und dann wird die Methode nochmals aufgerufen, mit einem leeren String "", dadurch wird logischerweise mein selectedEntry wieder überschrieben. 

Wie kommt das?

Danke !




P.S.: Ich kann den leeren String in der Methode "setSelectedItem" schon abfangen, dann funktioniert auch alles. Aber hier läuft doch trotzdem irgendwas falsch, oder?


----------



## m@nu (10. Jul 2008)

warum überschreibst du alle methoden vom DefaultComboBoxModel?
das DefaultComboBoxModel hat eben genau diesen vorteil, dass du objekte deiner wahl dem model hinzufügen kannst und dich nicht um das handling im hintergrund kümmern musst.


```
String[] values = new String[]{"A","B","C","D"};
DefaultComboBoxModel model = new DefaultComboBoxModel(values);

JComboBox combo = new JComboBox(model);
```

könnte mir vorstellen, das das dein problem löst?


----------



## shadow (10. Jul 2008)

Ich habe das Beispiel hier bewusst vereinfacht. Eigentlich gebe ich im Konstruktor von "MyComboBoxModel" eine Liste von Objekten aus der Datenbank mit. Bei "getElementAt(int index)" baue ich dann aus dem Objekt einen String zusammen, der dargestellt werden soll....


----------



## Gast2 (10. Jul 2008)

ja wo rufst du die methode denn auf?


----------



## shadow (10. Jul 2008)

Ich selbst gar nicht - sie wird aufgerufen, wenn man in der ComboBox mit der Maus einen anderen Wert auswählt...


----------



## Gast2 (10. Jul 2008)

irgendwo musst du sie noch selber aufrufen... 
sonst funktioniert es...


----------



## Michael... (10. Jul 2008)

Sind die zusammengebauten Inhalte dynamisch oder warum müssen diese beim Aufruf von getElementAt() immer wieder neu zusammengebaut werden?


----------



## shadow (10. Jul 2008)

Das ist der komplette Code zum ausprobieren:


```
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ComboBoxTest extends JFrame {

    private JTestComboBox combo;
        
    public static void main(String[] args) {
        new ComboBoxTest();
    }
    

    public ComboBoxTest() {
        
        setSize(400, 300);
        setLayout(null);
        
        combo = new JTestComboBox();
        combo.setLocation(50, 50);
        combo.setSize(100, 30);
        add(combo);
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        
    }
    
    public class JTestComboBox extends JComboBox {

        private MyComboBoxModel model;

        public JTestComboBox() {

            // model
            model = new MyComboBoxModel();
            setModel(model);

            // listener
            addActionListener(this);

        }


        private class MyComboBoxModel extends DefaultComboBoxModel {

            private List<String> entries;
            private String selectedEntry;

            public MyComboBoxModel() {


                // lists
                entries = new ArrayList<String>();

                // add fields
                entries.add("A");
                entries.add("B");
                entries.add("C");
                entries.add("D");

                selectedEntry = entries.get(0);

            }

            @Override
            public Object getElementAt(int index) {

                return entries.get(index);
                
            }

            @Override
            public int getSize() {
                return entries.size();
            }

            @Override
            public void setSelectedItem(Object anObject) {
                
                selectedEntry = (String)anObject;
                System.out.println("setSelectedItem: " + selectedEntry);
                
            }
            
            @Override
            public Object getSelectedItem() {
                
                return selectedEntry;
                
            }

        }    

    
    }

    
}
```


@Michael

Das ist natürlich ein Argument. Besser ist es, alles am Anfang einmal zusammen zu bauen. Trotzdem verstehe ich nicht, warum das obige Beispiel nicht geht...


----------



## Gast2 (10. Jul 2008)

für was ist ist diese zeile???

```
// listener
    addActionListener(this);
```

lass die einfach weg


----------



## shadow (10. Jul 2008)

Jetzt funktioniert es, danke!

Aber ich versteh nicht so ganz, was da jetzt passiert ist...


----------



## Gast2 (10. Jul 2008)

ja sag mir warum du ein actionlistener geaddet hast???


----------



## shadow (10. Jul 2008)

Das war ein Code-Zeilen-Relikt... In einer vorherigen Version wollte ich in der ComboBox reagieren, wenn der User einen anderen Eintrag auswählt. In der jeztigen Version mache ich das von außen.


----------



## Gast2 (10. Jul 2008)

da nimmst ein ItemChangeListener...
ja auf jeden fall hast halt irgendein actionListener geaddet der hat wahrscheinlich die methode aufgerufen


----------



## shadow (10. Jul 2008)

In meinem Beispiel siehst du, dass es keine "actionPerformed()"-Methode gibt. Aber es ging trotzdem nicht. Es war lediglich die "addActionListener"-Zeile, die den Code hat nicht funktionieren lassen. Und das verstehe ich eben nicht ganz...


----------



## Gast2 (10. Jul 2008)

ja weil du irgendein actionlistener geaddet hast... es kann ja sein dass deine oberklassen actionlistener haben ...


----------

