JavaFXTableView中的快速过滤
我需要在JavaFXTableView中实现一个过滤器,其中包含大量数据(大约100000个) 我试过了。它可以工作,但与swing相比,过滤速度非常慢 有人能帮我提高速度吗 现在发生的事情是,当我键入textproperty change fire up和filterdata时,速度很慢,我需要一些东西来显示筛选结果,并在swing中快速键入 提前谢谢JavaFXTableView中的快速过滤,java,swing,javafx-2,tableview,Java,Swing,Javafx 2,Tableview,我需要在JavaFXTableView中实现一个过滤器,其中包含大量数据(大约100000个) 我试过了。它可以工作,但与swing相比,过滤速度非常慢 有人能帮我提高速度吗 现在发生的事情是,当我键入textproperty change fire up和filterdata时,速度很慢,我需要一些东西来显示筛选结果,并在swing中快速键入 提前谢谢 p、 我也看过了。我使用这段代码进行过滤,但实际上我没有在大数据情况下进行测试 textField.textProperty().addLis
p、 我也看过了。我使用这段代码进行过滤,但实际上我没有在大数据情况下进行测试
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);
}
});
textField.textProperty(){
@凌驾
公共无效(可观察到){
if(textField.textProperty().get().isEmpty()){
tableView.setItems(数据列表);
返回;
}
ObservableList tableItems=FXCollections.observableArrayList();
ObservableList cols=tableView.getColumns();
对于(int i=0;i您可以使用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
}
}
);
observeListActualList=。。。;
FilteredList FilteredList=新的FilteredList(actualList);
TableView表格=。。。;
表2.setItems(filteredList);
//过滤
filteredList.setPredicate(
新谓词(){
公共布尔测试(YourObjectClass t){
返回false;//或true
}
}
);
和swing一样快,(可能比swing更快…。(我用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);
});
observeListData=table.getItems();
textfield.textProperty().addListener((observeValue@Override
公共void初始化(URL arg0,ResourceBundle arg1)
{
searchField.textProperty().addListener((obs、oldText、newText)->{
搜索();
});
@FXML私有无效搜索()
{
String关键字=searchField.getText();
if(关键字等于(“”){
表2.设置项目(数据);
}否则{
ObservableList Filteredata=FXCollections.observableArrayList();
用于(产品:数据){
if(product.getName().contains(关键字))
filteredData.add(产品);
}
表.设置项(过滤数据);
}
}
这与您的有什么不同?排序部分完成了,我现在需要添加过滤器,根据文本框中的文本变化过滤数据,我已经为swing应用程序或oracle网站提供了链接,该链接运行速度非常快(添加100000个)数据点,但我的javafx应用程序运行速度不快(有关javafx中的过滤,请参见相关链接)因为它的工作速度与排序速度相同,但我想知道swing是如何实现的,它检索数据的速度比javafx@b.pradeep快得多,无法进行过滤-你有没有解决这个问题的方法?@IJP不幸的是没有,你必须通过遍历表来编写自定义过滤,但javafx 8看起来很有希望,但我有我还没看过,你可以用它
@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);
}
}