【问题标题】:Filtering ObservableList with CheckBox in JavaFX在 JavaFX 中使用 CheckBox 过滤 ObservableList
【发布时间】:2018-11-15 10:34:19
【问题描述】:

我正在构建一个使用 JavaFX 作为副项目的日志阅读器,但在尝试在 TableView 上实现过滤时遇到了死胡同。

我所拥有的是几个CheckBoxes(图片的左侧),它们基本上将充当TableView 将显示的内容的过滤器:

单击Submit 按钮后,将打开一个后台线程来读取和解析文件。一旦操作终止,每次读取日志的结果都会插入到全局ObservableList<Log>

 public class Test_Filters extends Application {...

 private ObservableList<LogTest> logs = FXCollections.observableArrayList();

...}

我遇到的问题是如何处理:

  1. 检查多个过滤器CheckBox 的情况。
  2. CheckBox 未选中的情况。

对于 1.,我想知道处理此问题的最佳方法是什么。假设我选择了x 过滤器。这意味着我必须从ObservaleList 中过滤掉x 值:

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

【问题讨论】:

    标签: java javafx observablelist


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多