我需要在 javafx tableview 中使用大量数据(大约 100,000 )实现过滤器,
我试过这个教程。它可以工作,但与摆动排序和过滤代码相比,过滤确实很慢。
谁能帮我提高速度。
现在发生的事情是当我键入 textproperty change fire up 和 filterdata 但它很慢时,我需要一些东西来显示过滤结果,并且在摇摆中快速键入。
提前致谢。
ps 我也看过这个。
您可以使用 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);
}
}