在javafx tableview中快速过滤

lea*_*ner 7 java swing tableview javafx-2

我需要在javafx tableview中使用大量数据(大约100,000)实现一个过滤器,

我试过这个教程.它的工作原理,但滤波相比,摆动很慢排序和筛选,代码.

任何人都可以帮助我提高速度.

现在正在发生的事情就是当我键入textproperty更改启动和过滤数据但它很慢时,我需要一些显示过滤结果的东西,并且在摇摆中快速输入.

提前致谢.

ps我也看过这个.

gul*_*yuz 5

您可以使用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
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

像挥杆一样快((可能快于挥杆...)。(我测试了100000行)


Zai*_*tan 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);

        }
    });
Run Code Online (Sandbox Code Playgroud)

其中 ClassModel 是您的模型类