DefaultComboBoxModel

Status
Nicht offen für weitere Antworten.

shadow

Aktives Mitglied
Hallo,

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

Code:
    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

Bekanntes Mitglied
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.

Code:
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

Aktives Mitglied
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....
 

shadow

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

Gast2

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

Michael...

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

shadow

Aktives Mitglied
Das ist der komplette Code zum ausprobieren:

Code:
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...
 
G

Gast2

Gast
für was ist ist diese zeile???
Code:
    // listener
    addActionListener(this);

lass die einfach weg
 

shadow

Aktives Mitglied
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.
 
G

Gast2

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

shadow

Aktives Mitglied
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...
 
G

Gast2

Gast
ja weil du irgendein actionlistener geaddet hast... es kann ja sein dass deine oberklassen actionlistener haben ...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben