我有一个大约有 5K 行和 9 列的 TableView。 TableView 由 SortedList 和 FilteredList 支持。每列都可用于通过 ContextMenu 和 CheckBoxes 过滤 TableView。
public class ColumnFilter {
public ColumnFilter(TableFilter filter,TableColumn column) { // ... }
// ...
public boolean filter(item) {
ObservableValue<T> value = this.column.getcellObservableValue(item);
List<String> selectedValues = // ... get values from selected CheckBoxes in the ContextMenu
if(Objects.isnull(value) || Objects.isnull(value.getvalue())) return true;
for(String s : selectedValues) {
if(s.equals(value.getvalue().toString())) return true;
}
return false;
}
}
public class TableFilter {
public class TableFilter(TableView view) {
this.view = view;
this.filterList = new FilteredList<>(view.getItems());
this.sortedList = new SortedList<>(this.filterList);
this.sortedList.comparatorProperty().bind(tableView.comparatorProperty());
this.view.setItems(sortedList);
}
// Create a filter for every column
public void initialize() {
columnFilters.clear();
this.view.getcolumns().forEach( column -> {
columnFilters.add(new ColumnFilter(this,column));
});
}
// ....
// Set the predicate if a new filter item got added/removed
public void filter() {
this.filterList.setPredicate( p -> {
for(ColumnFilter filter : this.columnFilters) {
if(!filter.filter(p)) {
return false;
}
}
return true;
});
}
}
问题是添加的列(=ColumnFilters)越多,性能就会变得非常糟糕。例如,如果我只需要过滤一列,则大约需要几毫秒。对于所有 9 列,最多需要 2 秒。
如何提高性能?还是我需要在没有 FilteredList 的情况下进行过滤?