我编写了一个小应用程序,其中 TableView 带有多个过滤器选项。它看起来如下:
以下是应用程序中提供的过滤器选项:
目前我遇到的问题是我只能使用单个过滤条件。如果我尝试使用不同过滤条件的组合,它将忽略先前的过滤条件并使用最后的过滤条件来填充TableView。
例如 - 如果我在搜索表TextField中键入单词“OBJ”,那么该表将只包含对象名称或位置包含单词“OBJ”的行。现在,如果我选择Release 6 Objects Checkbox,表格将忽略Search Table TextField中提到的“OBJ”过滤器,并显示版本为6的所有对象。
我要做的是当我选择Release 6对象CheckBox时,Table应该只包含对象名称/位置包含“OBJ”并且版本为6的行。
同样,我想使用所有过滤条件或不同过滤条件的组合。任何人都可以帮我这个吗?
答案 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);
}
});