2017-01-13 6 views
1

Ich habe eine Datenbanktabelle mit Flughäfen, jeder Flughafen hat einen Namen und eine ID. In JavaFX habe ich ein Formular, mit einem ComboBox, die Combobox muss alle Flughafennamen anzeigen und wenn das Formular übermittelt wird, muss es die ID des Flughafens in die Datenbank einfügen (nicht seinen Namen).JavaFX ComboBox - Text anzeigen, aber ID bei der Auswahl zurückgeben

Aber ich bin nicht wirklich herauszufinden, was die Lösung ist.

Ich habe eine

ObservableList vliegveldenList = FXCollections.observableArrayList(); 
ObservableList vliegveldenIDList = FXCollections.observableArrayList(); 

Datenbankverbindung die ComboBox

ResultSet rs = Project_Fasten_Your_Seatbelt.conn.createStatement() 
.executeQuery("SELECT vliegveldnaam, vliegveld_id FROM fys_project.vliegvelden;"); 
while (rs.next()) { 
    vliegveldenList.add(rs.getString(1)); 
    vliegveldenIDList.add(rs.getString(2)); 
} 

Fülle die Combobox zu füllen:

vliegveldHerkomst.setValue("Luchthaven ..."); 
vliegveldHerkomst.setItems(vliegveldenList); 

Und dies wird in die Datenbank aufgenommen, wenn die Taste gedrückt wird:

String registratieValue = registratieNmrTxt.getText(); 
String vluchtValue = vluchtNrmTxt.getText(); 
String vliegveldValue = (String) vliegveldHerkomst.getSelectionModel().getSelectedItem(); 
String bestemmingValue = (String) vliegveldBestemming.getSelectionModel().getSelectedItem(); 
String gevondenValue = (String) vliegveldGevonden.getSelectionModel().getSelectedItem(); 
LocalDate dGevondenValue = datumGevondenDate.getValue(); 
LocalDate dVluchtValue = datumVluchtDate.getValue(); 
String gewichtValue = gewichtBagageTxt.getText(); 
String kleurenValue = (String) kleuren.getSelectionModel().getSelectedItem(); 
String kofferValue = (String) kofferMerken.getSelectionModel().getSelectedItem(); 
String opmerkingValue = opmerkingArea.getText(); 

//Data gevonden bagage invoeren 
Project_Fasten_Your_Seatbelt.conn.createStatement().executeUpdate(
     "INSERT INTO gevondenbagage " 
     + "(registratienummer, datumgevonden, datumaangemeld, vliegveldherkomst, " 
     + "vliegveldbestemming, vliegveldgevonden, vluchtnummer, vluchtdatum, gewicht, " 
     + "kleur, merk, `speciale opmerkingen`, userid)" 
     + "VALUES ('" + registratieValue + "','" + dGevondenValue + "','" + today.format(localDate) + "','" 
     + vliegveldValue + "','" + bestemmingValue + "','" + gevondenValue + "','" 
     + vluchtValue + "','" + dVluchtValue + "','" + gewichtValue + "','" 
     + kleurenValue + "','" + kofferValue + "','" + opmerkingValue + "','" 
     + Project_Fasten_Your_Seatbelt.getUserId() + "')"); 

Das funktioniert alles in Ordnung, aber anstelle des Namens des Flughafens möchte ich die ID für den Flughafen für vliegveldValue setzen.

Wie mache ich das?

+0

Das erste, was Sie tun sollten, ist eine 'Airport' Klasse mit' name' und 'id' Eigenschaften. Dann erstellen Sie eine Liste von 'Airport's (anstelle von zwei Listen) und machen Sie Ihre Combobox zu einer' ComboBox '(d. H. Die Elemente in der Combobox sind' Airport' Objekte). –

Antwort

5

Sie können z. eine AirPort Klasse mit ID und name Mitglieder und eine ComboBox, die diese Objekte anzeigt: ComboBox<AirPort>.

AirPort Klasse:

public class AirPort { 
    private int ID; 
    private String name; 

    public AirPort(int id, String name) { 
     this.ID = id; 
     this.name = name; 
    } 

    public int getID() { return ID; } 
    public String getName() { return name; } 
} 

die Elemente aus der DB holen und erstellen die ComboBox:

// Fill the list from the DataBase 
ObservableList<AirPort> airports = FXCollections.observableArrayList(); 
airports.addAll(new AirPort(0, "Heathrow"), 
    new AirPort(1, "Frankfurt"), 
    new AirPort(2, "NewYork")); 

ComboBox<AirPort> combo = new ComboBox<>(); 
combo.setItems(airports); 

schließlich den Namen der Objekte angezeigt werden können Sie beispielsweise verwenden, um eine StringConverter:

combo.setConverter(new StringConverter<AirPort>() { 

    @Override 
    public String toString(AirPort object) { 
     return object.getName(); 
    } 

    @Override 
    public AirPort fromString(String string) { 
     return combo.getItems().stream().filter(ap -> 
      ap.getName().equals(string)).findFirst().orElse(null); 
    } 
}); 

Und dann, wenn t er Wert ändert Sie zurück AirPort Objekte erhalten, die die benötigte ID enthält: „Ich habe eine Datenbank-Tabelle mit den Flughäfen, die jeweils Flughafen hat einen Namen und eine ID“

combo.valueProperty().addListener((obs, oldval, newval) -> { 
    if(newval != null) 
     System.out.println("Selected airport: " + newval.getName() 
      + ". ID: " + newval.getID()); 
});