JavaFx Editable ComboBox : Showing toString on item selection

后端 未结 2 1514
南旧
南旧 2020-12-13 22:32

I have a ComboBox of type Person , in which I have added few object of Person class,

I have used setCellFa

2条回答
  •  渐次进展
    2020-12-13 23:09

    Here is an answer to my own question which I found best after many efforts and corrections.

    mainComboBox.setButtonCell(
        new ListCell() {
            @Override
            protected void updateItem(Object t, boolean bln) {
                super.updateItem(t, bln);
                if (bln) {
                    setText("");
                } else {
                    setText(getStringField(t));
                }
            }
        });
    
    mainComboBox.setConverter(
        new StringConverter() {
            private Map map = new HashMap<>();
    
            @Override
            public String toString(Object t) {
                if (t != null) {
                    String str = getStringField(t);
                    map.put(str, t);
                    return str;
                } else {
                    return "";
                }
            }
    
            @Override
            public Object fromString(String string) {
                if (validate && !map.containsKey(string)) {
                    mainComboBox.setValue(null);
                    mainComboBox.getEditor().clear();
                    return null;
                }
                return map.get(string);
            }
        });
    
    mainComboBox.setCellFactory(
        new Callback, ListCell>() {
            @Override
            public ListCell call(ListView p) {
                ListCell cell = new ListCell() {
                    @Override
                    protected void updateItem(Object item, boolean empty) {
                        super.updateItem(item, empty);
                        if (empty) {
                            setText("");
                        } else {
                            setText(getStringField(item));
                        }
                    }
                };return cell;
            }
        });
    
    
    

    And with required function of getStringField(Object),

    public String getStringField(Object o) {
        return ((Pesron) o).getName();
    }
    

    提交回复
    热议问题