I use this code snippet for filtering, but in fact I have not tested in a huge data case
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); } });
where ClassModel is your model class
source share