java - 在 JavaFX 中使用 CheckBox 过滤 ObservableList

标签 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();

...}

我遇到的问题是如何处理:
  • 多个过滤器的情况 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/

    相关文章:

    JavaFX:嵌入式 JavaFX 小程序丢失宽度和高度?

    JavaFx ObservableSet 适配器

    java - 为 PositionalList 添加方法

    Java 等价于 Python 字典

    JavaFX - MVC 应用程序与数据库的最佳实践

    JavaFX - 哪种事件监听器方法更有效?

    Java 在编辑 observableList 时抛出 IndexOutOfBounds

    java - 没有错误,那么为什么 ObservableList 在这个项目中不起作用?

    java - 使用从微调器中选择的项目填充 imageview

    Java泛型编译错误