Фильтрация сеток довольно проста и довольно проста, как только вы ее освоите.
Во-первых, поймите, что объект Grid
на самом деле не фильтруется. DataProvider
, поддерживающий Grid
, фильтруется. Grid
автоматически обновляет свой собственный дисплей, чтобы соответствовать изменениям поставщика данных.
Ниже приведен пример приложения. Когда он появляется впервые, мы видим четыре элемента в виджете Grid
. Эти элементы являются просто java.time.LocalDate
объектами.
![before filtering](https://i.stack.imgur.com/9Rv3X.png)
Когда пользователь вводит номер года в IntegerField
, мы примените фильтр к объекту ListDataProvider
, поддерживающему нашу сетку. Если пользователь удаляет номер года из этого IntegerField
, мы удаляем все фильтры от нашего поставщика данных.
![after filtering](https://i.stack.imgur.com/PJvCy.png)
Установка и очистка фильтра (-ов) вступает в силу немедленно . Эта точка заставила меня я думал, что должен каким-то образом «применить» фильтры после вызова setFilter
или addFilter
. Но, нет, Grid
автоматически обновляет свой дисплей - без дополнительного кода с моей стороны. Тест предикатов, определенный как часть вашего фильтра, автоматически применяется к каждому элементу в наборе данных объекта ListDataProvider
. Элементы, прошедшие тест, отображаются, а элементы, не прошедшие тест, не отображаются.
Установка и очистка фильтров выполняется в прослушивателе изменения значений в виджете IntegerField
. Когда пользователь вводит число (и покидает поле, например, нажимая клавишу Tab или Return), автоматически вызывается наш объект-слушатель с пропущенным объектом события. Обратите внимание, что мы тестируем нулевой ключ, извлекаемый из IntegerField
. Ноль означает, что пользователь очистил существующую запись, оставив поле пустым.
Где мы определили наш ListDataProvider
объект для поддержки нашего Grid
объекта? Этот провайдер данных был создан для нас автоматически, когда мы передали List
методу Grid::setItems
.
Кстати, у вас может быть Grid
автоматически отображать столбцы, используя соглашения об именах в стиле JavaBeans (методы получения / установки). Но здесь, в этом примере, мы явно определили наши столбцы, их значения генерируются путем вызова переданных нами ссылок на метод LocalDate ::
.
package work.basil.example;
import com.vaadin.flow.component.AbstractField;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.IntegerField;
import com.vaadin.flow.data.provider.ListDataProvider;
import com.vaadin.flow.router.Route;
import java.time.LocalDate;
import java.time.Month;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* The main view contains a button and a click listener.
*/
@Route ( "" )
//@PWA ( name = "Project Base for Vaadin", shortName = "Project Base" )
@CssImport ( "./styles/shared-styles.css" )
@CssImport ( value = "./styles/vaadin-text-field-styles.css", themeFor = "vaadin-text-field" )
public class MainView extends VerticalLayout
{
private Grid < LocalDate > grid;
private IntegerField yearField;
public MainView ( )
{
yearField = new IntegerField( "Filter years before: " );
yearField.addValueChangeListener(
( AbstractField.ComponentValueChangeEvent < IntegerField, Integer > event ) -> {
Integer year = event.getValue();
// If the user cleared the field, its value is null. In such a case, clear all filters.
// If the user entered a year number into this field, specify a filter.
if ( Objects.isNull( year ) )
{
( ( ListDataProvider < LocalDate > ) grid.getDataProvider() ).clearFilters();
} else
{
( ( ListDataProvider < LocalDate > ) grid.getDataProvider() ).setFilter( ( LocalDate localDate ) -> localDate.getYear() < year );
}
}
);
grid = new Grid <>();
List < LocalDate > dates = List.of(
LocalDate.of( 2020 , Month.JANUARY , 23 ) ,
LocalDate.of( 2019 , Month.FEBRUARY , 24 ) ,
LocalDate.of( 2022 , Month.MARCH , 25 ) ,
LocalDate.of( 2011 , Month.APRIL , 26 )
);
grid.setItems( new ArrayList < LocalDate >( dates ) );
grid.addColumn( LocalDate :: toString );
grid.addColumn( LocalDate :: getYear );
grid.addColumn( LocalDate :: getDayOfWeek );
this.add( yearField , grid );
}
}
Вы можете установить несколько фильтров, вызвав addFilter
вместо setFilter
. Предикаты эффективно объединяются как И, а не как ИЛИ. Таким образом, все тесты предикатов должны пройти для отображения элемента. Звоните clearFilters
, чтобы удалить все фильтры. Вызов setFilter
очищает все существующие фильтры и устанавливает один фильтр.