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

Posted

技术标签:

【中文标题】JavaFX ComboBox - 显示文本但在选择时返回 ID【英文标题】:JavaFX ComboBox - Display text but return ID on selection 【发布时间】:2017-05-28 20:03:52 【问题描述】:

我有一个包含机场的数据库表,每个机场都有一个名称和一个 ID。

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

但我并没有真正弄清楚解决方案是什么。

我有一个

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

数据库连接填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));

填充组合框:

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

当按下按钮时,它会被添加到数据库中:

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() + "')");

这一切正常,但我想将机场的 ID 设置为 vliegveldValue,而不是机场的名称。

我该怎么做?

【问题讨论】:

"我有一个包含机场的数据库表,每个机场都有一个名称和一个 ID。"所以你应该做的第一件事是创建一个Airport 类,具有nameid 属性。然后创建一个Airports 列表(而不是两个列表)并将您的组合框设为ComboBox<Airport>(即组合框中的项目将是Airport 对象)。 【参考方案1】:

您可以创建例如一个具有IDname 成员的AirPort 类以及一个显示这些对象的ComboBoxComboBox<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; 

从数据库中获取项目并创建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);

最后显示您可以使用的对象的名称,例如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);
    
);

然后,当值发生变化时,您会返回包含所需 ID 的 AirPort 对象:

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

【讨论】:

我觉得fromString里面的语句可以改成return combox.getValue();如果可能的话,我希望你能解释一下你 fromString 中的命令【参考方案2】:

您的机场班......

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;

//类机场

创建可观察的机场列表

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"));

设置组合框的项目。 .

combo.setItems(airports);

之后,当你运行你的程序时,你会得到这样的输出。 ..

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

@Override
public String toString() 
    return this.getName();

在此之后,您将获得类似...的输出。


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

private void setEventOnAirport() 
    combo.setOnKeyReleased(event -> 
        if (event.getCode().equals(KeyCode.ENTER)) 
            Airport airport = combo.getSelectionModel().getSelectedItem();
            System.out.println(airport.getId());
        
    );

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

【讨论】:

不 - 你永远不会覆盖 toString 以满足应用程序的需要!相反,实现一个自定义单元工厂来处理其 updateItem 中的视觉表示 @kleopatra 你能详细说明一下吗?

以上是关于JavaFX ComboBox - 显示文本但在选择时返回 ID的主要内容,如果未能解决你的问题,请参考以下文章

javafx 创建 ComboBox TableCell

JavaFX ComboBox CSS 样式

如何以编程方式在 JavaFX ComboBox 中设置字符串值

如何修复 javafx 中的渲染错误(ComboBox、ListView)

如何将图像工具提示添加到 JavaFX 中的 ComboBox 项?

JavaFX - RichTextFX - 如何更改高亮文本颜色