首页 > 解决方案 > 过滤后的 ComboBox 中的文本编辑器不显示文本

问题描述

我将 Jonathan Stenbackas Answer ( JavaFX - Filtered ComboBox ) 改编为带有 Jooq Record Bean 的 ComboBox,使用自定义 ListCell/ButtonCell 显示其中一个 Beans 字段。过滤工作正常,但我无法让编辑器显示所选项目字段的文本。

我在组合框的选择中添加了一个侦听器,并让它打印出编辑器文本。所以我得到了 bean 的 toString(),但是 Editor 是空的。当我使用侦听器以编程方式设置文本时,以编程方式设置的文本被打印出来,但编辑器不显示它。我还尝试了一个 JavaFX bean 进行测试,结果相同。任何建议将不胜感激。

//retrieving data from database
ObservableList<MyRecord> items = applicationContext.getFetchData().fetchOList();

//wrapping in a FilteredList

FilteredList<MyRecord> filteredItems = new FilteredList<>(items, p -> true);

    ComboBox<MyRecord> cb = new ComboBox<>(filteredItems);
    cb.setEditable(true);
    cb.setCellFactory(c_ -> new NamenCell());
    cb.setButtonCell(new NamenCell());
    TextField editor = cb.getEditor();

    editor.textProperty().addListener((obs, oldValue, newValue) -> {

        final MyRecord selected = cb.getSelectionModel().getSelectedItem();

        Platform.runLater(() -> {
            if (selected == null || !selected.getSurname().equals(editor.getText())) {
                filteredItems.setPredicate(item -> {
                    if (item.getSurname().toLowerCase().contains(newValue.toLowerCase())) {
                        return true;
                    } else {
                        return false;
                    }
                });
            }

        });
    });


    cb.getSelectionModel().selectedItemProperty().addListener(
            (ob, oldValue, newValue) -> {
                if (newValue != null) {
                    cb.getEditor().setText(newValue.getSurname());
                    System.out.println(cb.getEditor().getText());

                }

            });


//The Cell class:

public class NamenCell extends ListCell<MyRecord> {

    public NamenCell() { }
    @Override
    protected void updateItem(MyRecord item, boolean empty) {
        super.updateItem(item, empty);
        setText(item == null ? "" : item.getSurname());

    }
}

标签: javajavafx

解决方案


我找到了解决方案:我扩展了 Combobox。也许这可能对某人有用:



       import javafx.application.Platform;
    import javafx.beans.property.Property;
    import javafx.beans.property.SimpleObjectProperty;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.collections.transformation.FilteredList;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.TextField;
    import org.jooq.impl.TableRecordImpl;


    public class FilterComboBox extends ComboBox {
        private ObservableList ol;
        private ObservableList items;
        private FilteredList filteredItems;
        private FilteredList filteredOl;
        private String field;
        private Property selectedBeanProperty = new SimpleObjectProperty();

        public FilterComboBox(){

        }

        public FilterComboBox(ObservableList ol, String field) {
          populate(ol,field);
        }


        public Property selectedBeanProperty() {
            return selectedBeanProperty;
        }

        public void setSelectedBeanProperty(T selectedBeanProperty) {
            this.selectedBeanProperty.setValue(selectedBeanProperty);
        }

        private ObservableList createItems(ObservableList ol, String field) {
            this.items = FXCollections.observableArrayList();
            for (T t : ol) items.add(t.get(field).toString());
            return items;
        }

        public void populate(ObservableList ol, String field){
            this.field=field;
            this.ol = ol;
            this.items = createItems(this.ol, field);
            this.filteredItems = new FilteredList(items, p -> true);
            this.filteredOl= new FilteredList(ol, p->true);
            this.setEditable(true);
            this.setItems(filteredItems);

            TextField editor = this.getEditor();
            editor.textProperty().addListener((obs, oldValue, newValue) -> {
                final String selected = this.getSelectionModel().getSelectedItem();

                Platform.runLater(() -> {
                    if (selected == null || !selected.equals(editor.getText())) {
                        filteredItems.setPredicate(item -> {
                            if (item.toLowerCase().contains(newValue.toLowerCase())) {
                                return true;
                            } else {
                                return false;
                            }
                        });
                    }


                });

            });

            this.getSelectionModel().selectedItemProperty().addListener((obs, oldValue, newValue) -> {
                if (newValue != null &&!newValue.isEmpty() ) {
                    setSelectedBeanProperty(this.ol.get(getOlIndex(newValue, field)));
                }
            });
        }

        public Integer getOlIndex(String s, String field){
            for (T t : ol)
                if(t.get(field).toString().equals(s)){
                return ol.indexOf(t);
            }
            return -1;
        }

    }


推荐阅读