使用JavaFX中的CheckBox过滤ObservableList

时间:2018-06-05 20:36:48

标签: java javafx observablelist

我正在构建一个使用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的情况。
  3. 对于1.,我想知道处理这个问题的最佳方法是什么。假设我选择了x个过滤器。这意味着我必须基本过滤掉x中的ObservaleList值:

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

1 个答案:

答案 0 :(得分:3)

您可以使用接受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您不需要重新读取日志记录,因为过滤器会立即应用于现有项目。