8

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

我试过这个教程它可以工作,但与摆动排序和过滤代码相比,过滤确实很慢。

谁能帮我提高速度。

现在发生的事情是当我键入 textproperty change fire up 和 filterdata 但它很慢时,我需要一些东西来显示过滤结果,并且在摇摆中快速键入。

提前致谢。

ps 我也看过这个

4

4 回答 4

7

您可以使用 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 行)

于 2015-09-05T17:15:23.373 回答
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);
        });
于 2015-11-24T10:02:30.380 回答
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 是您的模型类

于 2014-08-02T12:43:17.603 回答
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);
   }
}
于 2021-05-16T23:11:38.697 回答