我需要在javafx tableview中使用大量数据(大约100,000)实现过滤器,
我试过this tutorial。它起作用,但与swing sorting and filtering,code相比,过滤速度非常慢。
任何人都可以帮助我提高速度。
现在正在发生的事情就是当我键入textproperty更改启动和过滤数据但速度很慢时,我需要一些显示过滤结果的内容,并在挥杆时快速输入。
提前感谢。
p.s我也看了this。
答案 0 :(得分:4)
您可以使用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行)
答案 1 :(得分:4)
您可以使用以下代码。它适用于我..
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);
});
答案 2 :(得分:1)
我使用这段代码进行过滤,但实际上我没有在大数据情况下进行测试
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是您的模型类
答案 3 :(得分:0)
@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);
}
}