# Combobox füllen mit daten aus einer Tabelle



## gehdecke (21. Okt 2013)

Hallo Genies,

ich habe mal eine Bitte/Frage ich sitze hier über einer Aufgabe und komme nicht weiter. 

Ich wollte aus einer Datenbanktabelle mit Hilfe einer Methode mir die Einträge holen. Klappt auch

nun aber mein Problem wie kann ich das neue Item nun aber wieder als ID oder Namen nutzen? 

Ich würde ja gerne eine ID und den Namen als Item nutzen und wenn ich dann einen Eintrag auswähle soll er mir die ID als neues Objekt ausgeben. 


```
public Vector<String> getNamen() { 
        Vector<String> columnNames = new Vector<String>(); 
        Vector<String> data = new Vector<String>(); 
        try { 
            //  Connect to the Database 
            //  Read data from a table 
            String sql = "Select name from abteilungen"; 
            Statement stmt = connection.createStatement(); 
            ResultSet rs = stmt.executeQuery( sql ); 
            ResultSetMetaData md = rs.getMetaData(); 
            int columns = md.getColumnCount(); 

            //  Get row data 
            while (rs.next()) { 
                Vector<Object> row = new Vector<Object>(columns); 

                for (int i = 1; i <= columns; i++) { 
                    row.addElement( rs.getObject(i) ); 
                } 
                data.addElement( row.toString() ); 
            } 
            rs.close(); 
            stmt.close(); 
        } catch(Exception e) { 
            System.out.println( e ); 
        } 
        return data; 
    } 
bis hier klappt es. Meine ComboBox hat diese Einträge drin.

// JComboBox Abteilungen 
        Vector<String> abteilungsnamen = dbManager.getAbteilungsnamen();  klappt
        java.util.List<Abteilung> abteilung        = dbManager.getAbteilungsliste();  klappt nicht:-(
```

Auf Deutsch oder besser was ich will ist: 

Hallo Datenbank gib mir doch alle Einträge aus dem Feld Name und stelle Sie mir in einer Combobox zur Verfügung. Wenn ich nun einen neuen Eintrag auswähle gebe mir die ID und hinterlege Sie der aktuellen Person. 

Schnell gesagt aber ich sitz jetzt hier 3 Tage dran und träume nachts schon davon :-( oder )) es macht Spass aber ich komme nicht vorran:-((

Ich hoffe ihr könnt mir folgen und habt eine Idee wie Ihr mir helfen könntet.


10000000000 Dank Ihr lieben Leute


----------



## turtle (22. Okt 2013)

Eine Combobox arbeitet mit einem ComboBoxModel zusammen, um Daten anzuzeigen.
Das Tutorial gibt gute Hinweise:
How to Use Combo Boxes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
Jedenfalls solltest du ein eigenes Model bauen, in dem die beiden Attribute (Id und Name) zusammengefasst werden. Wenn ein solches Objekt der Combobox hinzugefügt wird, ruft Swing standardmässig die toString()-Methode deiner Klasse auf. Diese wird, sofern du sie nicht überschreibt, nicht die richtigen Informationen liefern.

Wenn du einen Eintrag selektierst, wird der Eintrag aus dem Model,also deine Klasse, geliefert. Und da drin ja beiden Werte (ID, Name) stehen, hast du beide Informationen sofort zur Verfügung.

Du kannst ein eigene ComboBoxModel-Klasse schreiben oder, (zunächst) einfacher, von DefaultComboBoxModel erben.

Du kannst später auch einen eigenen ListCellRenderer schreiben, der dann deine Werte so "malt", rendered, wie du es möchtest. Beispielsweise kann deine Combobox statt Ländernamen, die entsprechende Flagge als Bild anzeigen.


----------



## turtle (22. Okt 2013)

So, ich bin jetzt zu Hause am Rechner und habe ein kleines Testprogramm geschrieben, das mein Gesagtes verdeutlicht.
Am Screenshot siehst du wie es aussieht.


```
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class SimpleComboBoxDemo extends JPanel {
	String name;
	Integer id;

	public SimpleComboBoxDemo() {
		super(new BorderLayout());


		SimpleComboBoxDemo[] items = new SimpleComboBoxDemo[] {
				new SimpleComboBoxDemo("Item1", 17),
				new SimpleComboBoxDemo("Item2", 97), };
		DefaultComboBoxModel<SimpleComboBoxDemo> dcm = new DefaultComboBoxModel<>(
				items);
		JComboBox<SimpleComboBoxDemo> cbx = new JComboBox<>(dcm);
		add(cbx);
		cbx.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent event) {
				JComboBox<SimpleComboBoxDemo> cb = ((JComboBox<SimpleComboBoxDemo>) event
						.getSource());
				SimpleComboBoxDemo selectedItem = (SimpleComboBoxDemo) cb
						.getSelectedItem();
				JOptionPane.showMessageDialog(
						null,
						"Id:" + selectedItem.getId() + " für "
								+ selectedItem.getName());

			}
		});
	}


	public SimpleComboBoxDemo(String name, int id) {
		this.name = name;
		this.id = id;

	}

	@Override
	public String toString() {
		return name;
	}

	private static void createAndShowGUI() {
		JFrame frame = new JFrame("SimpleComboBoxDemo");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JComponent newContentPane = new SimpleComboBoxDemo();
		newContentPane.setOpaque(true);
		frame.setContentPane(newContentPane);

		frame.pack();
		frame.setVisible(true);
	}

	@Override
	public String getName() {
		return name;
	}

	@Override
	public void setName(String name) {
		this.name = name;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				createAndShowGUI();
			}
		});
	}
}
```


----------



## gehdecke (23. Okt 2013)

Hallo turtle,

super von Dir das nenne ich mal Hilfe damit habe ich es jetzt verstanden und werde es heute Abend gleich mal einbinden (meine Kenntnisse ) wenn ich noch Fragen habe kann ich diese dann noch stellen? 

Ich finde es gut das es Menschen gibt die es so machen wie Du, dadurch lernt man doch am besten und kann probieren. PERFEKT 


PS wie kann man sich hier bedanken?


LG


----------



## turtle (23. Okt 2013)

Danke-Button klicken


----------

