带有多个过滤器选项的Javafx TableView

时间:2016-09-12 17:04:45

标签: java javafx javafx-8

我编写了一个小应用程序,其中 TableView 带有多个过滤器选项。它看起来如下:

enter image description here

以下是应用程序中提供的过滤器选项:

  • 对象名称/位置 - TextField(搜索表)
  • 发布5/6对象 - CheckBox(第5版对象和第6版对象)
  • 实时对象 - CheckBox(实时对象)

目前我遇到的问题是我只能使用单个过滤条件。如果我尝试使用不同过滤条件的组合,它将忽略先前的过滤条件并使用最后的过滤条件来填充TableView。

例如 - 如果我在搜索表TextField中键入单词“OBJ”,那么该表将只包含对象名称或位置包含单词“OBJ”的行。现在,如果我选择Release 6 Objects Checkbox,表格将忽略Search Table TextField中提到的“OBJ”过滤器,并显示版本为6的所有对象。

我要做的是当我选择Release 6对象CheckBox时,Table应该只包含对象名称/位置包含“OBJ”并且版本为6的行。

同样,我想使用所有过滤条件或不同过滤条件的组合。任何人都可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

经过多次尝试,我找到了实现这一目标的方法。

之前我使用本地 SortedList FilteredList 变量以及 ObservableList 作为表格数据。现在我使用全局 SortedList FilteredList 变量。

从文件中读取数据时,将数据加载到 FilteredList ,然后使用 FilteredList 创建新的全局 SortedList 。然后将 SortedList comparatorProperty 与表 comparatorProperty 绑定,并将全局SortedList分配给表。

以下是执行上述操作的代码

filteredObjects = new FilteredList<>(objects, p -> true);
sortedObjects = new SortedList<>(filteredObjects);
sortedObjects.comparatorProperty().bind(tblPrimeCodeList.comparatorProperty());
tblPrimeCodeList.setItems(sortedObjects);

然后为每个过滤器字段添加一个新的ChangeListener,其中根据每个过滤器字段过滤器的值,将再次过滤数据。以下是TextField过滤器的代码搜索表

txtFilter.textProperty().addListener((observable, oldValue, newValue) -> {
filteredObjects.setPredicate(obj -> {
    if (!chkRel5.isSelected() && !chkRel6.isSelected()) {
        return false;
    }

    if (newValue == null || newValue.isEmpty()) {
    } else {
        String lowerCaseFilter = newValue.toLowerCase();
        if ( obj.getName().toLowerCase().contains(lowerCaseFilter) ||
             obj.getLocation().toLowerCase().contains(lowerCaseFilter)) {
        } else {
            return false;
        }
    }

    if (chkLiveObj.isSelected() && !obj.getLive()) {
        return false;
    }

    if (!chkRel5.isSelected() && obj.getVersion() == 5) {
        return false;
    }

    if (!chkRel6.isSelected() && obj.getVersion() == 6) {
        return false;
    }

    return true;
  });
});

以下是CheckBox 第5版对象

的代码
chkRel5.selectedProperty().addListener(new ChangeListener<Boolean>() {

@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
filteredObjects.setPredicate(obj -> {
    if (!chkRel5.isSelected() && obj.getVersion() == 5) {
        return false;
    }

    if (!chkRel6.isSelected() && obj.getVersion() == 6) {
        return false;
    }

    if (chkLiveObj.isSelected() && !obj.getLive()) {
        return false;
    }

    if (txtFilter.getText().trim().length() > 0) {
        String lowerCaseFilter = txtFilter.getText().trim().toLowerCase();
        if ( obj.getName().toLowerCase().contains(lowerCaseFilter) ||
             obj.getLocation().toLowerCase().contains(lowerCaseFilter)) {
        } else {
            return false;
        }
    }
    return true;
  });
    sortedObjects = new SortedList<>(filteredObjects);
  }
});