【问题标题】:How to add grid filters in Vaadin 8?如何在 Vaadin 8 中添加网格过滤器?
【发布时间】:2017-07-17 11:27:35
【问题描述】:

Vaadin 8 刚刚问世。在 Grid 中添加过滤器从未出现在他们的文档中,我只在 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 的代码?

【问题讨论】:

  • @Patryk Krawczyk 的解决方案适用于一列过滤器,但是当我有两列(如 FirstName 和 LastName)时,它不起作用。有人有解决办法吗?

标签: java vaadin vaadin8


【解决方案1】:

可以为 Vaadin 8 Grid 添加过滤。

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

final class Person {

    private String name;

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

    public String getName() {
        return name;
    }

}

我们的 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);
    }

}

现在,我们可以创建一个带有 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());
    }

}

结果如下图:

对于空输入结果是:foobarfoobar

对于 foo 结果是:foofoobar。

bar 的结果是:bar 和 foobar

对于 foobar 结果是:foobar

【讨论】:

  • 谢谢,这是我经过大量搜索后找到的关于过滤的最佳解释。非常感谢。
  • 但它仅适用于一个字段。如果您在其他列上添加相同的过滤器,它将不起作用
【解决方案2】:

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

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

请在此处阅读 GridUtil 作者对工作量的估计。

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

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2018-03-25
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多