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

gig*_*igz 15 java vaadin vaadin8

瓦丁8刚刚出来.在网格过滤器的文档中添加从来没有,我只找到一个可行的解决方案在这里的计算器.

  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);
Run Code Online (Sandbox Code Playgroud)

但是现在自更新以来,此解决方案不再有效,因为SimpleStringFilter在新网格中不再可用,并且BeanItemContainer不再被识别,只允许setItems()填充网格数据.

任何人都可以帮我更新Vaadin 8的代码吗?

Pat*_*zyk 13

可以为Vaadin 8 Grid添加过滤功能.

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

final class Person {

    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

}
Run Code Online (Sandbox Code Playgroud)

我们的Grid实现如下所示:

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,我们可以使用TextField创建一个布局,它将成为我们的过滤器:

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());
    }

}
Run Code Online (Sandbox Code Playgroud)

结果如下所示: 使用Vaadin 8 Grid过滤

对于空输入结果是:foo,barfoob​​ar.

对于foo,结果是:foofoo bar.

对于酒吧结果是:酒吧和foo 酒吧.

对于foob​​ar结果是:foob​​ar.


Juk*_*kki 5

有Vaadin网格插件,稍后将被移植到Vaadin 8,所以如果你有时间等待它,你可以在漂亮的包中获得过滤器行.

https://vaadin.com/directory#!addon/gridutil

请在此阅读GridUtil作者的努力估算.

https://github.com/melistik/vaadin-grid-util/issues/37#issuecomment-282756130