Фильтрация ObservableList с помощью CheckBox в JavaFX

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

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

Окно

После нажатия кнопки 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())));

person Kobbi Gal    schedule 05.06.2018    source источник


Ответы (1)


Вы можете использовать FilteredList JavaFX, который принимает 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 вам не нужно перечитывать записи журнала, так как фильтр применяется сразу к существующим элементам.

person M. le Rutte    schedule 05.06.2018