12 votes

Filtrage rapide dans un tableau javafx

J'ai besoin d'implémenter un filtre dans une tableview javafx avec des données volumineuses (environ 100 000),

J'ai essayé ce tutoriel . Il fonctionne mais le filtrage est très lent par rapport à Swing. le tri et le filtrage , code .

Quelqu'un peut-il m'aider à augmenter la vitesse ?

Ce qui se passe actuellement, c'est que lorsque je tape textproperty change s'affiche et filterdata mais c'est lent, j'ai besoin de quelque chose qui montre le résultat du filtre en tapant rapidement comme cela se passe dans swing.

Merci d'avance.

p.s. J'ai également consulté cette .

10voto

guleryuz Points 2000

Vous pouvez utiliser 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
        }
    }
);

aussi rapide que swing, (peut-être plus rapide que swing... ). (J'ai testé avec 100000 lignes)

4voto

Harshita Sethi Points 803

Vous pouvez utiliser le code suivant. Il fonctionne bien pour moi

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

1voto

bakr msaadi Points 11
@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);
   }
}

1voto

Zaid Sultan Points 78

J'utilise cet extrait de code pour le filtrage, mais je n'ai pas testé dans le cas de données volumineuses.

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

        }
    });

où ClassModel est votre classe de modèle

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X