我正在构建一个使用JavaFX作为辅助项目的日志阅读器,并且在尝试在TableView
上实现过滤时已经走到了尽头。
我所拥有的是一些CheckBox
es(图片的LHS),它基本上可以作为TableView
将显示的内容的过滤器:
单击Submit
按钮后,将打开后台线程以读取和解析文件。操作终止后,每个日志读取的结果将插入到全局ObservableList<Log>
:
public class Test_Filters extends Application {...
private ObservableList<LogTest> logs = FXCollections.observableArrayList();
...}
我遇到的问题是如何处理:
CheckBox
的情况。CheckBox
的情况。对于1.,我想知道处理这个问题的最佳方法是什么。假设我选择了x
个过滤器。这意味着我必须基本过滤掉x
中的ObservaleList
值:
logTable.setItems(logTable.getItems().filtered(log -> !log.getSource().equals(checkBox.getText())));
答案 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
您不需要重新读取日志记录,因为过滤器会立即应用于现有项目。