Фильтрация ObservableList с помощью CheckBox в JavaFX - PullRequest
0 голосов
/ 05 июня 2018

Я создаю программу чтения журналов с JavaFX в качестве побочного проекта и зашел в тупик при попытке реализовать фильтрацию на TableView.

. У меня есть несколько CheckBox es.(LHS изображения), которые в основном будут действовать как фильтры для отображения TableView:

Window

Как только кнопка Submitпо щелчку открывается фоновый поток для чтения и анализа файлов.Как только операция завершается, результат каждого чтения журнала вставляется в глобальный ObservableList<Log>:

 public class Test_Filters extends Application {...

 private ObservableList<LogTest> logs = FXCollections.observableArrayList();

...}

. У меня возникли проблемы с тем, как справиться:

  1. Ситуация, когда проверяется более одного фильтра CheckBox.
  2. Ситуация, когда CheckBox не проверяется.

Для 1. Мне было интересно, как лучшеиметь дело с этим.Допустим, у меня выбрано x фильтров.Это означало бы, что мне нужно отфильтровать x значений из ObservaleList:

logTable.setItems(logTable.getItems().filtered(log -> !log.getSource().equals(checkBox.getText())));

1 Ответ

0 голосов
/ 06 июня 2018

Вы можете использовать JavaFX FilteredList, который принимает Predicate.Вы можете обновить предикат для каждого фильтра, комбинируя их по своему усмотрению.

 FilteredList<LogTest> items = new FilteredList<>(originalItems);
 tableView.setItems(items);

 ... on update of filter UI items
 Predicate<LogTest> containsFoo = i -> i.getName().contains("foo");
 Predicate<LogTest> isSevere = i -> i.getLevel() == Level.SEVERE;
 Predicate<LogTest> filter = containsFoo.or(isSevere);

 items.setPredicate(filter);

Если вы хотите снова отобразить все записи, просто установите предикат на null:

 items.setPredicate(null);

При использовании FilteredList вам не нужно перечитывать записи журнала, так как фильтр сразу применяется к существующим элементам.

...