在JavaFX中使用CheckBox过滤ObservableList

Kob*_*Gal 2 java javafx observablelist

我正在使用JavaFX作为辅助项目构建日志读取器,并且在尝试对进行过滤时陷入僵局TableView

我所拥有的是几个CheckBoxes(图片的LHS),它们基本上将充当所显示内容的过滤器TableView

窗口

Submit单击该按钮后,将打开一个后台线程以读取和解析文件。操作终止后,每次读取日志的结果都会插入到global中ObservableList<Log>

 public class Test_Filters extends Application {...

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

...}
Run Code Online (Sandbox Code Playgroud)

我遇到的麻烦是如何处理:

  1. CheckBox检查多个过滤器的情况。
  2. 一种CheckBox未经检查的情况。

对于1.,我想知道解决此问题的最佳方法是什么。假设我x选择了过滤器。这意味着我基本上必须从中过滤掉xObservaleList

logTable.setItems(logTable.getItems().filtered(log -> !log.getSource().equals(checkBox.getText())));
Run Code Online (Sandbox Code Playgroud)

M. *_*tte 6

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

如果要再次显示所有记录,只需将谓词设置为null

 items.setPredicate(null);
Run Code Online (Sandbox Code Playgroud)

使用,FilteredList您不需要重新读取日志记录,因为过滤器会立即应用于现有项目。