Проблема
Проблема в вашем коде состоит в том, что строка this.legacy.getValue()
захватила значение виджета Checkbox
в тот момент, когда вы определяете этот фильтр. Значение для сравнения было извлечено из компонента, когда был установлен фильтр, и это значение остается тем же, даже если компонент обновляется. По сути, это то же самое, что если бы вы разбили его на две строки:
Boolean value = this.legacy.getValue(); // Captured once, not when user checks/unchecks the checkbox widget.
listDataProvider.setFilterByValue(Product::getLegacy, value);
Решение
Вам нужно захватить текущее состояние виджета Checkbox
в тот момент, когда его значение меняется, когда оно было отмечено или не отмечено.
Примерно так: слушатель сбрасывает новый фильтр, используя текущее значение виджета.
this.legacy.addValueChangeListener(
event ->
listDataProvider
.setFilterByValue(
Product::getLegacy ,
event.getValue()
)
;
Вам не нужно делать clearFilters()
между ними, поскольку все методы set
очищают любые существующие фильтры. Существуют отдельные методы add
, которые сохраняют существующие фильтры.
Вопреки тому, что вы указали в своем вопросе, метод refreshAll()
действительно заставляет фильтр снова запускаться для всех элементов в поставщике. Вы можете использовать refreshAll()
для повторной оценки фильтра, если фильтр определен таким образом, чтобы считывать текущее значение из компонента каждый раз, когда он вызывается.
listDataProvider.setFilter(
product ->
product.getLegacy().equals( this.legacy.getValue() )
);
Используя лямбду в этом В строке выше текущее состояние виджета-флажка legacy
фиксируется на лету, когда фильтр выполняет сравнения по элементам в поставщике данных.