在 JavaFX 中使用 CheckBox 过滤 ObservableList
Filtering ObservableList with CheckBox in JavaFX
我正在用 JavaFX 构建日志 reader 作为副项目,但在尝试对 TableView
.
执行过滤时遇到了死胡同
我有一些 CheckBox
es(图片的左轴),它们基本上用作 TableView
将显示的过滤器:
单击 Submit
按钮后,将打开一个后台线程来读取和解析文件。操作终止后,每次读取日志的结果都会插入全局 ObservableList<Log>
:
public class Test_Filters extends Application {...
private ObservableList<LogTest> logs = FXCollections.observableArrayList();
...}
我苦恼的是如何处理:
- 检查了多个过滤器
CheckBox
的情况。
CheckBox
未选中的情况。
对于 1.,我想知道处理这个问题的最佳方法是什么。假设我选择了 x
个过滤器。这意味着我必须基本上从 ObservaleList
:
中过滤掉 x
值
logTable.setItems(logTable.getItems().filtered(log -> !log.getSource().equals(checkBox.getText())));
您可以使用 JavaFX 的 FilteredList
, which accepts a 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
您不需要重新读取日志记录,因为过滤器会立即应用于现有项目。
我正在用 JavaFX 构建日志 reader 作为副项目,但在尝试对 TableView
.
我有一些 CheckBox
es(图片的左轴),它们基本上用作 TableView
将显示的过滤器:
单击 Submit
按钮后,将打开一个后台线程来读取和解析文件。操作终止后,每次读取日志的结果都会插入全局 ObservableList<Log>
:
public class Test_Filters extends Application {...
private ObservableList<LogTest> logs = FXCollections.observableArrayList();
...}
我苦恼的是如何处理:
- 检查了多个过滤器
CheckBox
的情况。 CheckBox
未选中的情况。
对于 1.,我想知道处理这个问题的最佳方法是什么。假设我选择了 x
个过滤器。这意味着我必须基本上从 ObservaleList
:
x
值
logTable.setItems(logTable.getItems().filtered(log -> !log.getSource().equals(checkBox.getText())));
您可以使用 JavaFX 的 FilteredList
, which accepts a 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
您不需要重新读取日志记录,因为过滤器会立即应用于现有项目。