javafx tableview 中的快速过滤

问题描述 投票:0回答:4

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

我已经尝试过本教程。它可以工作,但与 swing 排序和过滤代码相比,过滤确实很慢。

谁能帮我提高速度。

现在发生的事情是,当我输入 textproperty 更改启动并过滤数据时,但速度很慢,我需要一些可以像 swing 中那样快速输入来显示过滤结果的东西。

提前致谢。

p.s我也看过这个

java swing javafx-2 tableview
4个回答
10
投票

FilteredList

您可以在 JavaFX 8+ 中使用

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行)


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

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 是您的模型类


1
投票
@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);
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.