我需要在javafx tableview中实现一个具有大量数据(大约100,000)的过滤器,
我已经尝试过本教程。它可以工作,但与 swing 排序和过滤,代码相比,过滤确实很慢。
谁能帮我提高速度。
现在发生的事情是,当我输入 textproperty 更改启动并过滤数据时,但速度很慢,我需要一些可以像 swing 中那样快速输入来显示过滤结果的东西。
提前致谢。
p.s我也看过这个。
FilteredList
FilteredList
。
ObservableList<YourObjectClass> actualList = ...;
FilteredList<YourObjectClass> filteredList = new FilteredList<>(actualList);
TableView table = ...;
table.setItems(filteredList);
// to filter
filteredList.setPredicate(
new Predicate<YourObjectClass>(){
public boolean test(YourObjectClass t){
return false; // or true
}
}
);
和摆动一样快,(也许比摆动更快......)。 (我测试了100000行)
您可以使用以下代码。对我来说效果很好..
ObservableList data = table.getItems();
textfield.textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
if (oldValue != null && (newValue.length() < oldValue.length())) {
table.setItems(data);
}
String value = newValue.toLowerCase();
ObservableList<T> subentries = FXCollections.observableArrayList();
long count = table.getColumns().stream().count();
for (int i = 0; i < table.getItems().size(); i++) {
for (int j = 0; j < count; j++) {
String entry = "" + table.getColumns().get(j).getCellData(i);
if (entry.toLowerCase().contains(value)) {
subentries.add(table.getItems().get(i));
break;
}
}
}
table.setItems(subentries);
});
我使用这段代码进行过滤,但实际上我没有在大数据情况下进行测试
textField.textProperty().addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
if(textField.textProperty().get().isEmpty()) {
tableView.setItems(dataList);
return;
}
ObservableList<ClassModel> tableItems = FXCollections.observableArrayList();
ObservableList<TableColumn<ClassModel, ?>> cols = tableView.getColumns();
for(int i=0; i<dataList.size(); i++) {
for(int j=0; j<cols.size(); j++) {
TableColumn col = cols.get(j);
String cellValue = col.getCellData(dataList.get(i)).toString();
cellValue = cellValue.toLowerCase();
if(cellValue.contains(textField.textProperty().get().toLowerCase())) {
tableItems.add(data.get(i));
break;
}
}
}
tableView.setItems(tableItems);
}
});
其中 ClassModel 是您的模型类
@Override
public void initialize(URL arg0, ResourceBundle arg1)
{
searchField. textProperty().addListener((obs, oldText, newText) -> {
search();
});
@FXML private void search()
{
String keyword = searchField.getText();
if (keyword.equals("")) {
table.setItems(data);
} else {
ObservableList<Product> filteredData = FXCollections.observableArrayList();
for (Product product : data) {
if(product.getName().contains(keyword))
filteredData.add(product);
}
table.setItems(filteredData);
}
}