rückgabewert combobox

Status
Nicht offen für weitere Antworten.

kaka81

Mitglied
hallo zusammen,

bin ziemlicher anfänger im programmieren und habe folgendes problem:
ich habe ein jcombobox mit daten aus einer mysql datenbank befüllt. in der datebank gibt es 2 tabelle: restaurant und locations. restaurant ist über einen foreign key mit locations verknüpft. In locations gibts eine id spalte (primärschlüssel) und location (orte)
so nun zum eigentlichen problem:
ich befülle eine combobox mit den werten aus location, also nur dem namen der tabelle. wenn ich nun einen neuen datensatz anlegen will, muss ich natürlich einen ort auswählen. die combobox soll mir nun aber die id zurückliefern, damit mein insert into statement funzt...

wie geht das? mit "getselecteditem" oder "getindex" funzt es nicht, weil ich einen int als rückgabewert brauche und keinen string.

kann mir jemand weiterhelfen?

vielen dank schonmal im vorraus

lg
cm
 
Ich würde an Deiner Stelle eine eigene Klasse schreiben, die neben einem String auch einen Integer-Wert speichert. Beim Auslesen aus der Datenbank füllst Du dann die JCombobox einfach mit diesen Klassen, vorher Name und ID natürlich aus der Datenbank nehmen und in Deine eigens geschriebene Klasseninstanzen hauen.
Immer dran denken: JCombobox nimmt nicht explizit String auf, sondern Objekte. Für die Darstellung wird im Normalfall einfach das Ergebnis von toString() genommen. Ach, hier mal Beispiel, einmal für die Klasse:
Java:
public class DataElement {

	private String text;
	private int id;
	
	public DataElement(int id, String text){
		this.text = text;
		this.id = id;
	}
	
	public int getID(){
		return id;
	}
	
	public String toString() {
		return text;
	}
}
Reinpacken in die JCombobox dann in etwa so:
Java:
box.addItem(new DataElement(1, "Titel"));
box.addItem(new DataElement(3, "Test"));
box.addItem(new DataElement(27, "Funktionuckelt"));
Und auslesen, wenn sich etwa die Auswahl geändert hat, so:
Java:
DataElement de = (DataElement)box.getSelectedItem();
System.out.println("Text: \"" + de + "\" ID: " + de.getID());

Gruß FatFire
 
Stimmt denn die ID mit dem Index in der ComboBox überein? Dann könntest Du auch schreiben:
int wert = comBox1.getSelectedIndex();
 
Manchmal ist es ein echtes Handicap nur im Anfängerteil des Forums zu jagen...naja, wenigstens war meine Idee auch genau der gleiche Weg.

Gruß FatFire
 
das mit dem index funktioniert leider nicht, weil id != index, leider.

zur möglichen lösung von FatFire:
die daten kommen ja von der db.

das heißt also:

Java:
DataElement de = (DataElement)box.getSelectedItem();
System.out.println("Text: \"" + de + "\" ID: " + de.getID());

würde funktionieren, nur

Java:
box.addItem(new DataElement(1, "Titel"));
box.addItem(new DataElement(3, "Test"));
box.addItem(new DataElement(27, "Funktionuckelt"));

würde ich ja nicht benötigen, da die daten ja aus der db kommen oder?

danke und lg
cm
 
Java:
box.addItem(new DataElement(1, "Titel"));
box.addItem(new DataElement(3, "Test"));
box.addItem(new DataElement(27, "Funktionuckelt"));

würde ich ja nicht benötigen, da die daten ja aus der db kommen oder?
Naja irgendwie müssen die Daten ja in die ComboBox. Entweder über den Konstruktor oder über das Model, oder eben mit addItem()
 
Und wenn Du Dir die IDs in einfach einem Array abspeicherst (Index des Arrays entspräche Index in der ComboBox)?
Das ist natürlich sehr simpel gedacht, aber das erste was mir dazu einfiele.
 
Das würde natürlich auch gehen, aber warum zusammengehörende Daten trennen, wenn man sie auch einfach zusammen halten kann?

Gruß FatFire
 
jawoll, besten dank leute. hat wunderbar funktioniert!!!
jetzt spiele ich mich noch etwas mit meinem jtable (von markierter reihe die daten auslesen), falls ich nicht zurecht komme, melde ich mich wieder.

also, vielen dank leute einstweilen!!! :toll:

lg
cm
 
sorry leute, da war ich wohl zu schnell:
ich verwende dieselbe combobox noch in einem anderen frame wo mir ein jtable angezeigt wird.
jetzt möchte ich den jtable nach dem namen oder id (das ist jetzt egal) filtern, jedoch weiß ich nicht mit welchem eventlistener ich das machen soll.

actionlistener funktioniert aus irgendeinem grund nicht. der jtable soll sobald ich einen ort gewählt/angeklickt, habe sich aktualisieren. die abfrage hierzu hab ich schon, es geht wirklich rein nur um den eventlistener. habe schon fast alle ausprobiert, mousover, mouseclicked, propertychanged,...

habe nämlich auch einen button "show all" eingebaut und bei den meisten mouselistenern wird der event gestartet sobald ich mit der mouse über combobox drüberfahre.

das ich mehrere wählen kann ist klar, weiß nur nicht welche ich hier kombinieren soll?!

danke und gruß
cm
 
Ist die ComboBox editierbar oder nicht? Wenn sie nicht editierbar ist, funktioniert der ActionListener auf jeden Fall so wie man es erwartet. Wenn sie editierbar ist, kann die Erwartung schon von den Tatsachen abweichen. In jedem Fall ist Dein Fehler bestimmt nicht ein fehlender ActionEvent. Erklär mal genauer wie der ActionListener nicht funktioniert; wird er nicht aufgerufen?

Ebenius
 
also die combobox ist nicht editierbar.
verwende folgenden code im listener:

Java:
comboModel sort = (comboModel) searchLocation.getSelectedItem();

        try{
            rs = stmt.executeQuery ("select name, bewertung, location " +
                                    "from restaurants " +
                                    "     join locations on (locations.id = location_id) where locations.id = " + sort.gedID());

        }
        catch (SQLException e){
            System.out.print(e.toString());
        }

       restaurantTable.setModel(new RestaurantTableModel(rs));
       restaurantTable.updateUI();


        restaurantTable.repaint();
        restaurantTable.revalidate();

und als fehlermeldung erhalte ich:
18.06.2009 00:02:07 restaurantadministration.view.restaurantsJFrame initComponents
SCHWERWIEGEND: null
java.sql.SQLException: Operation not allowed after ResultSet closed

nur hab ich keine ahnung wo in meinem code ResultSet closed sein sollte?! verwende eine ähnliche abfrage um den jtable ein start des programms zu füllen.

wenn ich den code wie oben beschrieben bei einem anderen listener einfüge, funktionierts, nur eben halt nicht so wie ich (geschweige denn mein professore) sich das vorstelle
 
Ich mutmaße: Du kannst ein bereits benutztes Statement nicht wiederverwenden. Das hat in jedem Fall nichts mit dem falschen Listener zu tun.

Lies Dich mal ein bisschen in JDBC ein; zum Beispiel hier: Sun Java™ Tutorial: JDBC.

Ebenius
 
hm, wie könnte ich dieses problem denn sonst noch lösen? die anforderung lautet:
- möglichkeit, diese auflistung nach dem ort zu filtern...

aber komischerweise habe ich im gleichen frame einen button "aktualisieren" eingebaut, der mir die liste nach hinzufügen eines neuen restaurants aktualisiert und dies funktioniert auch. ist die komplett gleiche abfrage wie beim starten des programms.
nur beim "nach orte filtern" habe ich noch eine where bedingung angehängt, ansonsten ist sie gleich... ich verstehs nicht... ???:L

gäbe es noch andere lösungsansätze?
 
ist die komplett gleiche abfrage wie beim starten des programms. nur beim "nach orte filtern" habe ich noch eine where bedingung angehängt... ich verstehs nicht...

gäbe es noch andere lösungsansätze?
An der WHERE-Clause liegt es nicht im eigentlichen SELECT-Statement liegt es auch nicht. Es liegt nur daran, dass Du die JDBC-Klassen nicht richtig verwendest. In welcher Weise Du das genau falsch machst kann ich nicht sagen, da dies weder aus der Fehlermeldung noch aus dem Quelltextausschnitt genau hervorgeht.

Wo wird denn stm erzeugt? Wurde das ggf. schonmal verwendet? Hast Du mal in das Tutorial geschaut, da gibt es ganz einfache Beispiele die alle funktionieren.

Ebenius
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben