JavaFXComboBox-如何获得不同的提示文本和所选项目文本?

JavaFXComboBox-如何获得不同的提示文本和所选项目文本?,java,javafx,combobox,Java,Javafx,Combobox,我搜索了一下,但找不到答案。组合框是可编辑的。如何在组合框提示文本和下面的对象列表中显示不同的文本?在列表中,我希望使用对象的toString方法,但当我选择它时,我只希望在提示文本中显示所选对象的一个属性 我该怎么做?是否可以在提示文本字段和下面的列表中以不同方式显示对象的值 这一用法的一个例子就是歌曲。假设我按标题搜索一首歌曲,然后它会显示标题、作曲家和乐器如下的歌曲。当我选择歌曲时,我只希望标题显示在提示文本中(因为我在其他地方显示作曲家和乐器信息)。使用使用短版本进行转换的单元格和自定义

我搜索了一下,但找不到答案。组合框是可编辑的。如何在组合框提示文本和下面的对象列表中显示不同的文本?在列表中,我希望使用对象的toString方法,但当我选择它时,我只希望在提示文本中显示所选对象的一个属性

我该怎么做?是否可以在提示文本字段和下面的列表中以不同方式显示对象的值

这一用法的一个例子就是歌曲。假设我按标题搜索一首歌曲,然后它会显示标题、作曲家和乐器如下的歌曲。当我选择歌曲时,我只希望标题显示在提示文本中(因为我在其他地方显示作曲家和乐器信息)。

使用使用短版本进行转换的单元格和自定义单元格来创建显示扩展版本的单元格:

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();
}
静态类项{
私人最终字符串完整、部分;
公共项(字符串已满,字符串部分){
this.full=full;
这个部分=部分;
}
公共字符串getFull(){
全额退还;
}
公共字符串getPart(){
返回部分;
}
}
@凌驾
公共无效开始(阶段primaryStage){
ComboBox ComboBox=新的ComboBox(FXCollections.observableArrayList(
新项目(“AB”、“A”),
新项目(“CD”、“C”)
));
comboBox.setEditable(真);
//在textfield中使用短文本
comboBox.setConverter(新的StringConverter(){
@凌驾
公共字符串toString(项对象){
返回对象==null?null:object.getPart();
}
@凌驾
公共项fromString(String){
返回comboBox.getItems().stream().filter(i->i.getPart().equals(string)).findAny().orElse(null);
}
});
comboBox.setCellFactory(lv->new ListCell(){
@凌驾
受保护的void updateItem(项,布尔值为空){
super.updateItem(项,空);
//在列表单元格中使用全文(列表弹出窗口)
setText(item==null?null:item.getFull());
}
});
场景=新场景(组合框);
初级阶段。场景(场景);
primaryStage.show();
}

是否要使用可编辑组合框的文本字段过滤下拉列表中显示的结果?请注意,如果未选择任何项目,则提示文本是显示的文本,因此独立于项目的任何
toString
方法。这很可能类似于
请选择项目
,而不是项目的
toString
结果。。。在我下面的回答中将其解释为“文本字段中显示的文本”。如果这是一个不正确的解释,请在评论中告诉我。。。