gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:09:26 25 4
gpt4 key购买 nike

我编写了一个小型应用程序,其中有一个带有多个过滤器选项TableView。如下所示:

enter image description here

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

  • 对象名称/位置 - 文本字段(搜索表)
  • 发布 5/6 对象 - 复选框(发布 5 对象和发布 6 对象)
  • Activity 对象 - 复选框( Activity 对象)

目前我面临的问题是我一次只能使用单个过滤条件。如果我尝试使用不同过滤条件的组合,它会忽略以前的过滤条件并使用最后一个过滤条件来填充 TableView。

例如 - 如果我在搜索表文本字段中输入单词“OBJ”,则该表将仅包含对象名称或位置包含单词“OBJ”的行。现在,如果我选择“版本 6 对象”复选框,该表将忽略搜索表文本字段中提到的“OBJ”过滤器,并显示版本为 6 的所有对象。

我想做的是,当我选择 Release 6 对象复选框时,表应仅包含对象名称/位置包含“OBJ”且版本为 6 的行。

同样,我想使用所有过滤条件或不同过滤条件的组合。谁能帮我解决这个问题吗?

最佳答案

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

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

从文件中读取数据时,将数据加载到 FilteredList 中,然后使用 FilteredList 创建一个新的全局 SortedList。然后将 SortedList comparatorProperty 与表 comparatorProperty 绑定(bind),并将全局 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;
});
});

下面是复选框释放 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);
}
});

关于具有多个过滤器选项的 Javafx TableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com