我搜索了一下,但无法找到答案。 Combobox是可编辑的。如何在Combobox提示文本和下面的对象列表中显示不同的文本?在列表中我想要使用Object的toString方法,但是当我选择它时,我只希望在提示文本中显示所选Object的一个属性。
我该怎么做?是否可以在提示文本字段和下面的列表中以不同方式显示对象的值?
使用的一个例子是歌曲。让我们说我按标题搜索一首歌,然后它会显示下面带有标题,作曲家和乐器的歌曲。当我选择歌曲时,我只希望标题显示在提示文本中(因为我在其他地方显示作曲家和乐器信息)。
答案 0 :(得分:2)
使用使用短版本进行转化的converter
和自定义cellFactory
来创建显示扩展版本的单元格:
static class Item {
private final String full, part;
public Item(String full, String part) {
this.full = full;
this.part = part;
}
public String getFull() {
return full;
}
public String getPart() {
return part;
}
}
@Override
public void start(Stage primaryStage) {
ComboBox<Item> comboBox = new ComboBox<>(FXCollections.observableArrayList(
new Item("AB", "A"),
new Item("CD", "C")
));
comboBox.setEditable(true);
// use short text in textfield
comboBox.setConverter(new StringConverter<Item>(){
@Override
public String toString(Item object) {
return object == null ? null : object.getPart();
}
@Override
public Item fromString(String string) {
return comboBox.getItems().stream().filter(i -> i.getPart().equals(string)).findAny().orElse(null);
}
});
comboBox.setCellFactory(lv -> new ListCell<Item>() {
@Override
protected void updateItem(Item item, boolean empty) {
super.updateItem(item, empty);
// use full text in list cell (list popup)
setText(item == null ? null : item.getFull());
}
});
Scene scene = new Scene(comboBox);
primaryStage.setScene(scene);
primaryStage.show();
}