我正在用 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())));
最佳答案
您可以使用 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
您不需要重新读取日志记录,因为过滤器会立即应用于现有项目。
关于java - 在 JavaFX 中使用 CheckBox 过滤 ObservableList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50708559/