Ответ 1
Можно добавить фильтрацию для 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, бар и foobar.
Для foo результат: foo и foo.
Для bar результат: бар и foo бар.
Для результата foobar: foobar.