JavaFXTableView中的快速过滤

JavaFXTableView中的快速过滤,java,swing,javafx-2,tableview,Java,Swing,Javafx 2,Tableview,我需要在JavaFXTableView中实现一个过滤器,其中包含大量数据(大约100000个) 我试过了。它可以工作,但与swing相比,过滤速度非常慢 有人能帮我提高速度吗 现在发生的事情是,当我键入textproperty change fire up和filterdata时,速度很慢,我需要一些东西来显示筛选结果,并在swing中快速键入 提前谢谢 p、 我也看过了。我使用这段代码进行过滤,但实际上我没有在大数据情况下进行测试 textField.textProperty().addLis

我需要在JavaFXTableView中实现一个过滤器,其中包含大量数据(大约100000个)

我试过了。它可以工作,但与swing相比,过滤速度非常慢

有人能帮我提高速度吗

现在发生的事情是,当我键入textproperty change fire up和filterdata时,速度很慢,我需要一些东西来显示筛选结果,并在swing中快速键入

提前谢谢


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);
   }
}