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
类,具有name
和id
属性。然后创建一个Airport
s 列表(而不是两个列表)并将您的组合框设为ComboBox<Airport>
(即组合框中的项目将是Airport
对象)。
【参考方案1】:
您可以创建例如一个具有ID
和name
成员的AirPort
类以及一个显示这些对象的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;
从数据库中获取项目并创建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 中设置字符串值
如何修复 javafx 中的渲染错误(ComboBox、ListView)