# JComboBox befüllen geht nicht.



## Louis2 (4. Aug 2005)

Hallo,

ich hole aus der DB Daten und speichere sie in einer ArrayList (da ich die Anzahl der Sätze nicht kenne). Nun möchte ich diese Daten aus der ArrayList in eine JComboBox einfügen, geht aber nicht... liegt es am Array der eine feste Grösse haben sollte? Die JComboBox muss sich, wenn aus der DB weniger oder mehr Daten kommen, anpassen, also Flexibilität 

```
try
{
        String resultbelegtabelle=new String();
        Statement belegtabelle = connection.createStatement(); 
        resultbelegtabelle = "SELECT d.description FROM description d, doctable do WHERE do.active='1' and do.doctable=d.code AND d.language='de'";
        ResultSet rs = belegtabelle.executeQuery(resultbelegtabelle); 
        
        List description = new ArrayList(); 
        while (rs.next()) 
        { 
            description.add(rs.getString(1));
        }
        List listdescription = (java.util.List) description; 
        int beleglen=listdescription.size();
        
        for (int n=0;n<beleglen;n++) 
        { 
            String outlistdescription = (String) listdescription.get(n);
            String comboinhalt[n] = outlistdescription; // Wie kann ich die JComboBox füllen?
            System.out.println(outlistdescription);
        }
}
catch(Exception e3) 
{    
    JOptionPane.showMessageDialog(null, "Error: " + "\n" + e3.getMessage()); 
}
```


----------



## thE_29 (4. Aug 2005)

Du könntest dir die ArrayList komplett sparen und die ComboBox gleich per addItem(Object) befühlen!


----------



## mic_checker (4. Aug 2005)

abgesehen davon das in diesem Fall die Variante von the_29 besser wäre (denn wozu nen Umweg über ArrayList gehen ?): Wo übergibst du der ComboBox die Liste ? Und was genau geht nicht ? Wird einfach nichts angezeigt o. nur ein Teil ?


----------



## Louis2 (4. Aug 2005)

D.h gleich nach dem auslesen aus der DB die ComboBox als Array mit addItem füllen?? Muss ich dabei nicht die bestimmte Länge, bzw. Anzahl an Sätze kennen?

Die Fehlermeldung sieht im Moment wie folgt aus:

```
catch(Exception e3) 
{    
    JOptionPane.showMessageDialog(null, "Error: " + "\n" + e3.getMessage()); 
}
```

wie ausgeführt und da erscheint bei Error: null 

Danach geht mein Code so weiter

```
for (int i = 0; i < comboinhalt.length; i++)
            combo.addItem(comboinhalt[i]);
            getContentPane().add(combo, BorderLayout.WEST);
            combo.addItemListener(new ItemListener() 
{
.
```

und da erscheint bei der for-Schleife

```
Exception in thread "main" java.lang.NullPointerException
```


----------



## mic_checker (4. Aug 2005)

hast du combo nur deklariert oder auch instanziert ? (also das objekt richtig erzeugt) 

warum das getContentPane()....und addItemListener innerhalb der Schleife ? das muss raus.


----------



## Louis2 (4. Aug 2005)

```
JComboBox combo = new JComboBox();
```
 So ist es deklariert.

So sieht mein Code aus

```
try
        {
        String resultbelegtabelle=new String();
        Statement belegtabelle = connection.createStatement(); 
        resultbelegtabelle = "SELECT d.description FROM description d, doctable do WHERE do.active='1' and do.doctable=d.code AND d.language='de'";
        ResultSet rs = belegtabelle.executeQuery(resultbelegtabelle); 
        
        List description = new ArrayList(); 
        while (rs.next()) 
        { 
            description.add(rs.getString(1));
        }
        listdescription = (java.util.List) description; 
        int beleglen=listdescription.size();
        
        for (int n=0;n<beleglen;n++) 
        { 
            outlistdescription = (String) listdescription.get(n);
            comboinhalt[n] = outlistdescription;
            System.out.println(outlistdescription);
        }
        }
        catch(Exception e3) 
        {    
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + e3.getMessage()); 
        }
                        
        for (int i = 0; i < comboinhalt.length; i++)
            combo.addItem(comboinhalt[i]);
            getContentPane().add(combo, BorderLayout.WEST);
            combo.addItemListener(new ItemListener() 
        {
            //Action when combo value selected
            public void itemStateChanged(ItemEvent e) 
            {
                String resultauftrag=new String();
                JComboBox selectedChoice = (JComboBox)e.getSource();
                if (selectedChoice.getSelectedItem().equals(comboinhalt[1]))
                {         
.
```

Die Fehlermeldung (s. oben) erscheint dann.
Ich habe nun probiert einfach mal die ComboBox hardcodiert zu füllen 

```
final String comboinhalt[] = 
{
    "Wählen Sie bitte eine Tabelle", "Kundenaufträge"
};
```
und das ganze von try{} bis catch{} wegzulassen, geht aber wieso wie oben nicht???


----------



## mic_checker (4. Aug 2005)

Poste bitte einfach mal alles. Dann hat man einen Überblick und man weiss wo die NPE wahrscheinlich ausgelöst wurde.


----------



## Louis2 (4. Aug 2005)

(siehe Posting das ist der ganze Code zum befüllen, danach wird nur die JTable gefüllt wenn z.b comboinhalt[1] ausgewählt wird.


----------



## mic_checker (4. Aug 2005)

hmmm...versteh nicht wo gerad das problem gewesen wäre den kompletten code vollständig , zusammenhängend zu posten...aber egal.

Du brauchst für die JComboBox einen ItemListener. Die JComboBox fügst du einmal zum ContentPane hinzu. In der Schleife rufst du nur addItem(...) auf.

Kontrollier vorher einfach sicherheitshalber nochmal ob combo != null etc.


----------



## Louis2 (4. Aug 2005)

Weil alles zu posten ca. Seiten lang wäre und da Code drin steht, was man nicht braucht.
Der Code zum füllen der JComboBox ist:

```
public EmailClient() 
{
.
.
try
{
        String resultbelegtabelle=new String();
        Statement belegtabelle = connection.createStatement(); 
        resultbelegtabelle = "SELECT d.description FROM description d, doctable do WHERE do.active='1' and do.doctable=d.code AND d.language='de'";
        ResultSet rs = belegtabelle.executeQuery(resultbelegtabelle); 
        
        List description = new ArrayList(); 
        while (rs.next()) 
        { 
            description.add(rs.getString(1));
        }
        listdescription = (java.util.List) description; 
        int beleglen=listdescription.size();
        
        for (int n=0;n<beleglen;n++) 
        { 
            outlistdescription = (String) listdescription.get(n);
            comboinhalt[n] = outlistdescription;
            //System.out.println(outlistdescription);
        }
}
catch(Exception e3) 
{    
	JOptionPane.showMessageDialog(null, "Error: " + "\n" + e3.getMessage()); 
}
                            
        for (int i = 0; i < comboinhalt.length; i++)
            combo.addItem(comboinhalt[i]);
            getContentPane().add(combo, BorderLayout.WEST);
            combo.addItemListener(new ItemListener() 
        {
            //Action when combo value selected
            public void itemStateChanged(ItemEvent e) 
            {
                String resultauftrag=new String();
                JComboBox selectedChoice = (JComboBox)e.getSource();
                if (selectedChoice.getSelectedItem().equals(comboinhalt[1]))
                {                
                    //Get data from Database and save them in ArrayList    
                    try
                    {
                        Statement auftrag = connection.createStatement(); 
                        resultauftrag = "SELECT DISTINCT d.customerno, d.companyname, c.contactnumber, a.AUF001, a.AUF012, a.AUF004, a.AUF015, a.AUF016, a.AUF020 FROM customer_data d, Auftrag a, contactnumber c, description de WHERE a.customerid=d.customerid AND d.addressid=c.addressid AND de.description='E-Mail'";
                        ResultSet rs = auftrag.executeQuery(resultauftrag);
			// Ab hier Code zum füllen der JTable 
}
public static void main(String[] args) 
{
        EmailClient frame = new EmailClient();
        frame.setDefaultCloseOperation(EmailClient.EXIT_ON_CLOSE);
        frame.setDefaultLookAndFeelDecorated(true);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.pack();
        frame.setSize(900,485);
}
```

Wenn ich jetzt das ausführe kommt beim compilieren:
1. Exception e3 wird ausgeführt - Error: null
2. 
	
	
	
	





```
Exception in thread "main" java.lang.NullPointerException
        at emailclient.EmailClient.<init>(EmailClient.java:274)
        at emailclient.EmailClient.main(EmailClient.java:622)
```
274 - 
	
	
	
	





```
for (int i = 0; i < comboinhalt.length; i++)
```
622 - 
	
	
	
	





```
EmailClient frame = new EmailClient();
```


----------



## sisko78 (4. Aug 2005)

Der StackTrace für e3 könnte hilfreich sein, lass den mal ausgeben und poste den mal hier. Ist rs.next() überhaupt true?


----------



## Louis2 (4. Aug 2005)

sisko78 hat gesagt.:
			
		

> Der StackTrace für e3 könnte hilfreich sein, lass den mal ausgeben und poste den mal hier. Ist rs.next() überhaupt true?



Also wenn ich in der FOR-Schleife 
	
	
	
	





```
System.out.println(outlistdescription);
```
 ausgebe,
gibt er mir die Einträge der DB, 6 wie ich will.

StackTrace... damit kann ich nichts anfangen ihr?

```
[Ljava.lang.StackTraceElement;@1d99a4d
```


----------



## Bert Brenner (4. Aug 2005)

e3.printStackTrace();


----------



## Louis2 (4. Aug 2005)

```
java.lang.NullPointerException
        at emailclient.EmailClient.<init>(EmailClient.java:260)
```

260 ist bei mir - 
	
	
	
	





```
comboinhalt[n] = outlistdescription;
```


----------



## sisko78 (4. Aug 2005)

Wo hast du denn comboinhalt[] initialisiert?


----------



## Louis2 (4. Aug 2005)

Ganz am Anfang:

```
public class EmailClient extends JFrame implements WindowListener, ActionListener
{
    .
    .
    .
    private JButton sendButton = new JButton("     Send Messages     ");
    private JButton cancelButton = new JButton("Cancel");
    private JLabel valueLabel = new JLabel("               Number of rows: ");
    .
    .
    String comboinhalt[];
    private Date currentDate; 
    .    
    .
   
    public EmailClient() 
    {
        .
        .
```


----------



## sisko78 (4. Aug 2005)

Hast du dem Array auch eine Größe zugewiesen?

```
comboinhalt = new String[beleglen];
```


----------



## Louis2 (4. Aug 2005)

sisko78 hat gesagt.:
			
		

> Hast du dem Array auch eine Größe zugewiesen?
> 
> ```
> comboinhalt = new String[beleglen];
> ```



Das wars... man man man einfach... :wink: 
Nun Verbesserung, paar haben gemeint, dass ich die ArrayList weglassen könnte und gleich alles in die ComboBox schreiben kann. Ich brauche ja aber die Anzahl an Sätze um meine Grösse festzulegen wie kriege ich das ohne ArrayList hin?


----------



## sisko78 (4. Aug 2005)

Was spricht denn dagegen, in der while Schleife das Füllen der ComboBox zu veranlassen? Solange Ergebnisse aus der Datenbank kommen, wird die ComboBox um einen Eintrag erweitert.


----------

