当前位置: 首页 > 知识库问答 >
问题:

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

孙嘉
2023-03-14

Vaadin 8刚出来。在Grid中添加过滤器从来没有出现在他们的文档中,我只在stackoverflow中找到了一个可行的解决方案。

  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()填充网格数据。

谁能帮我更新瓦丁8的代码

共有2个答案

宰父才
2023-03-14

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

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

请在此阅读GridUtil作者的工作评估。

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

南门烈
2023-03-14

可以为Vaadin 8 Grid添加过滤。

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

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

}

现在,我们可以创建一个布局,其中的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());
    }

}

对于空输入,结果是:foo、bar和foobar。

对于foo,结果是:foo和foobar。

对于条形图结果为:条形图和条形图。

对于foobar,结果为:foobar。

 类似资料:
  • 我想在Vaadin 11的网格中实现自动换行。据我所知,你需要为此做两件事: < li >设置相应单元格的样式。 < li >增加行高。 我使用以下代码完成了第一步: productsGrid.addColumn(TemplateRenderer.of(“[[item.name]]”).withProperty(“name”,产品::getName)).setHeader(“name”); 现在我

  • 我想删除Vaadin 8网格中所有单元格周围的边框。我不相信这可以用代码来做,并且表格的css不适用于网格,因此你如何为网格执行此操作?

  • 是否有可能强制Vaadin8网格从后端热切地加载所有行?目前,它只显示屏幕上可见的记录,并在网格滚动时获取下一行。

  • Vaadin 7中的和组件之间有什么区别? 我应该使用哪种,何时使用?

  • 单击包含< code>VerticalLayout行等组件的Vaadin 8 中的单元格时,不会选中该行(使用Vaadin 8.1.5)。 如果组件未填充整个单元格,则单击单元格中未使用的区域会使该行处于选中状态。 我一直在研究如何将点击组件转发到单元格点击侦听器,但尚未对此有任何控制。猜猜这甚至不是最好的方法。 解决方案是什么?

  • 我使用spring cloud gateway将请求路由到我的下游应用程序,我定义了如下的路由器 路由工作正常,现在我需要添加一个预过滤器,它可以执行一些预条件并获得路由路径。但不知道如何动态更改uri。uri(“http://localhost:8081/test") 下面是我在preFilter中尝试的代码。 因此,我需要根据我的自定义过滤器中的db查找返回,从传入路径/user/test/*