【发布时间】:2017-02-28 22:27:32
【问题描述】:
我正在使用 TextFiled 过滤 JavaFX TableView 的行,这会导致设置为 TableView 的 SortedList 并且它可以工作,我还创建了一个函数,该函数将该 SortedList 作为参数来执行其他操作,问题是虽然过滤在表格中生效,但 SortedList 没有改变值,这是否意味着过滤隐藏了行而不是将它们从 TableView 初始列表中删除,请帮助,这是我的代码:
FilteredList<CommandeFX> filteredData = new FilteredList<>(data, p -> true);
// 2. Set the filter Predicate whenever the filter changes.
filterField.textProperty().addListener((observable, oldValue, newValue) -> {
filteredData.setPredicate(commande -> {
// If filter text is empty, display all persons.
if (newValue == null || newValue.isEmpty()) {
return true;
}
// Compare first name and last name of every person with filter text.
String lowerCaseFilter = newValue.toLowerCase();
if (String.valueOf(commande.getCodeCommande()).toLowerCase().contains(lowerCaseFilter)) {
return true;
// Filter matches first name.
} else if (String.valueOf(commande.getCMD()).toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
else if (String.valueOf(commande.getClient()).toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
else if (String.valueOf(commande.getFournisseur()).toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
else if (String.valueOf(commande.getQuantite()).toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
else if (String.valueOf(commande.getPrixCommande()).toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
else if (String.valueOf(commande.getSommeProperty()).toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
else if (String.valueOf(commande.getResteCommandeProperty()).toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
else if (String.valueOf(commande.getDateCommande()).toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
else if (String.valueOf(commande.getDateReception()).toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
else if (String.valueOf(commande.getModified()).toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
else if (String.valueOf(commande.getValide()).toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
return false; // Does not match.
});
});
// 3. Wrap the FilteredList in a SortedList.
SortedList<CommandeFX> sortedData = new SortedList<>(filteredData);
// 4. Bind the SortedList comparator to the TableView comparator.
sortedData.comparatorProperty().bind(tableCommandes.comparatorProperty());
// 5. Add sorted (and filtered) data to the table.
tableCommandes.setItems(sortedData);
// the function
setSum(sortedData);
【问题讨论】:
-
排序列表应该包含与过滤列表相同的元素 - 即您应该会看到过滤的结果。实际发生了什么让您认为它不起作用?
-
我看到了过滤的结果,过滤后的列表总是与原始列表大小相同,这是我的问题,但不再是因为这意味着与过滤器不匹配的行设置为空,这可以解决我的问题,谢谢!
-
我并没有真正遵循这一点。问题是什么?还是你没有问题了?
-
在将排序列表添加到其中后,我需要遍历 TableView 行,因此我只能处理可见行。
-
for (CommandeFX c : sortedData) { ... }
标签: java javafx filter tableview rows