有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Vaadin 8中添加网格过滤器?

瓦丁8号刚出来。在网格中添加过滤器从未出现在他们的文档中,我在stackoverflow中只找到了一个可行的解决方案here

  HeaderCell cell = filterRow.getCell(pid);
                    // Have an input field to use for filter
                    TextField filterField = new TextField();
                    filterField.setColumns(0);
                    filterField.setHeight("23");



                    // Update filter When the filter input is changed
                    filterField.addTextChangeListener(change -> {
                        // Can't modify filters so need to replace
                        b.removeContainerFilters(pid);

                        // (Re)create the filter if necessary
                        if (! change.getText().isEmpty())
                            b.addContainerFilter(
                                new SimpleStringFilter(pid,
                                    change.getText(), true, false));
                    });
                    cell.setComponent(filterField);

但自从更新后,这个解决方案不再有效,因为SimpleStringFilter在新网格中不再可用,BeanItemContainer不再被识别,只允许setItems()填充网格数据

有人能帮我更新Vaadin 8的代码吗


共 (1) 个答案

  1. # 1 楼答案

    可以为Vaadin 8网格添加过滤

    假设我们已经将模型定义为:

    final class Person {
    
        private String name;
    
        public Person(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
    }
    

    我们的网格实现如下所示:

    final class PersonGrid extends Grid<Person> {
    
        public PersonGrid() {
            List<Person> persons = new ArrayList<>();
            persons.add(new Person("foo"));
            persons.add(new Person("bar"));
            persons.add(new Person("foobar"));
    
            addColumn(Person::getName).setCaption("Name");
    
            setItems(persons);
        }
    
    }
    

    现在,我们可以创建一个带有文本字段的布局,它将成为我们的过滤器:

    final class FilteredGridLayout extends VerticalLayout {
    
        private final PersonGrid personGrid;
        private final TextField nameFilter;
    
        public FilteredGridLayout() {
            nameFilter = new TextField();
            nameFilter.setPlaceholder("Name...");
            nameFilter.addValueChangeListener(this::onNameFilterTextChange);
            addComponent(nameFilter);
    
            personGrid = new PersonGrid();
            addComponentsAndExpand(personGrid);
        }
    
        private void onNameFilterTextChange(HasValue.ValueChangeEvent<String> event) {
            ListDataProvider<Person> dataProvider = (ListDataProvider<Person>) personGrid.getDataProvider();
            dataProvider.setFilter(Person::getName, s -> caseInsensitiveContains(s, event.getValue()));
        }
    
        private Boolean caseInsensitiveContains(String where, String what) {
            return where.toLowerCase().contains(what.toLowerCase());
        }
    
    }
    

    结果如下所示: Filtering using Vaadin 8 Grid

    对于空输入,结果是:foobarfoobar

    对于foo结果是:foofoo

    对于bar,结果是:bar和foobar

    对于foobar,结果是:foobar