JavaFX ComboBox - 显示文本但在选择时返回ID

LTK*_*ort 6 java sql combobox javafx

我有一个机场数据库表,每个机场都有一个名称和一个ID.

在JavaFX中,我有一个表单,其中ComboBox,组合框需要显示所有机场名称,并且在提交表单时,需要将机场的ID插入数据库(而不是其名称).

但我真的不知道解决方案是什么.

我有一个

ObservableList vliegveldenList = FXCollections.observableArrayList();
ObservableList vliegveldenIDList = FXCollections.observableArrayList();
Run Code Online (Sandbox Code Playgroud)

填充数据库连接 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));
}
Run Code Online (Sandbox Code Playgroud)

填充组合框:

vliegveldHerkomst.setValue("Luchthaven ...");
vliegveldHerkomst.setItems(vliegveldenList); 
Run Code Online (Sandbox Code Playgroud)

按下按钮时会将其添加到数据库中:

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() + "')");
Run Code Online (Sandbox Code Playgroud)

这一切都运行正常,但我想为机场的名称设置机场的名称,而不是机场的名称vliegveldValue.

我该怎么做呢?

DVa*_*rga 19

您可以AirPort使用IDname成员创建一个类,并ComboBox显示这些对象:ComboBox<AirPort>.

AirPort 类:

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; }
}
Run Code Online (Sandbox Code Playgroud)

从数据库中获取项目并创建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);
Run Code Online (Sandbox Code Playgroud)

最后显示您可以使用的对象的名称,例如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);
    }
});
Run Code Online (Sandbox Code Playgroud)

然后当值发生变化时,您将获得AirPort包含所需ID的对象:

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


小智 6

您的机场班级...

public class Airport {

private int id;
private String name;

public Airport(int id, String name) {
    super();
    this.id = id;
    this.name = name;
}

public int getId() {
    return id;
}

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

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

}//类机场

创建机场的可观察列表

ObservableList<AirPort> airports = FXCollections.observableArrayList();
airports.add(new Airport(1, "Beijing Capital International Airport"));
airports.add(new Airport(2, "Los Angeles International Airport"));
airports.add(new Airport(3, "London Heathrow Airport"));
Run Code Online (Sandbox Code Playgroud)

设置组合框的项目。.

combo.setItems(airports);
Run Code Online (Sandbox Code Playgroud)

在此之后,当你运行你的程序时,你会得到这样的输出。.. 在此处输入图片说明

要获取机场的名称,您必须在Airport类中覆盖 toString 方法。

@Override
public String toString() {
    return this.getName();
}
Run Code Online (Sandbox Code Playgroud)

在此之后,您将获得类似...的输出。 在此处输入图片说明


现在要获取所选机场的 id,您可以设置一个事件处理程序。.

private void setEventOnAirport() {
    combo.setOnKeyReleased(event -> {
        if (event.getCode().equals(KeyCode.ENTER)) {
            Airport airport = combo.getSelectionModel().getSelectedItem();
            System.out.println(airport.getId());
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

通过此功能,您可以查看所选机场的ID。. .

  • 不 - 您永远不会为应用程序需要覆盖 toString !相反,实现一个自定义单元工厂来处理其 updateItem 中的可视化表示 (9认同)