Фильтр tableView оставляет некоторые данные в определенном столбце - PullRequest
0 голосов
/ 25 сентября 2019

Я сделал мое табличное представление со столбцом, и все работает нормально.

Я заметил только одну вещь: когда я фильтрую строки, некоторые данные остаются в столбце, который я определил, как это cellFactory.

Изображение, показывающее проблему:

enter image description here

код столбца:

 @FXML
        private TableColumn<Log, Integer> colQuanJour;

colQuanJour.setCellValueFactory(new PropertyValueFactory<>("quantite"));

CellFactory для добавления цвета исимвол (+ или -)

colQuanJour.setCellFactory( 
               new Callback<TableColumn<Log,Integer>,TableCell<Log,Integer>>(){
           @Override
           public TableCell<Log, Integer> call(TableColumn<Log, Integer> param) {
              return new TableCell<Log, Integer>(){
                  @Override
                  protected void updateItem(Integer item, boolean empty) {
                      if( ! empty){

                          int currIndex = indexProperty().getValue() < 0 ? 0 
                                  : indexProperty().getValue();

                          int operIndex = param.getTableView().getItems().get(currIndex).getOperation().getId_operation();
                          setStyle("-fx-font-weight: bold");
                          String Char ;
                          if(operIndex == 2){
                              setStyle("-fx-font-size : 16px");
                              setStyle("-fx-text-fill : red");
                               Char = "-";
                          }else {
                              setStyle("-fx-font-size : 16px");
                              setStyle("-fx-text-fill : green");
                               Char = "+";
                          }
                          String val = String.valueOf(param.getTableView().getItems().get(currIndex).getQuantite());
                          setText(Char+val);
                      }
                  }

              };

           }

        });

Журнал - это pojo, который содержит правильное количество (SimpleIntegerProperty).

, и моя таблица - это

TableView<Log> tblart;

функция для фильтрации:

эта функция берет значение из comboBox, чтобы выбрать столбец для фильтрации, по умолчанию она фильтрует всю таблицу, как показано ниже:

   void filterOneJour(String id,String newVal){
    ObservableList<Log> obsList = FXCollections.observableArrayList();

    for(Log jour : tblJour.getItems()){
                String num = String.valueOf(jour.getNum());
                String qte = String.valueOf(jour.        
                switch(id){

                    case "Numéro" : 
                        if(num.toUpperCase().contains(newVal))
                            obsList.add(jour);break;

                    case "Quantité":
                        if(qte.toUpperCase().contains(newVal))
                            obsList.add(jour);break;

                    default : 
                        if(num.toUpperCase().contains( qte.toUpperCase().contains(newVal) )
                            obsList.add(jour);
                }         
    }
    tblJour.setItems(obsList);

}

Так что я надеюсь, что всеясно, я думаю, что проблема исходит от cellFactory, а точнее updateItem.

1 Ответ

4 голосов
/ 26 сентября 2019

Да, как вы упомянули, проблема в методе updateItem.TableView (фактически VirtualFlow) отображается с использованием тех же строк / ячеек, чтобы избежать проблем с производительностью.Строка / ячейка updateItem будет вызываться на основе предоставленного элемента.В вашем случае вы добавили обновление только ячейки, если элемент присутствует, и проигнорировали его, когда он пуст.Таким образом, ячейка не будет обновляться для пустых строк.

Чтобы исправить вашу проблему .. вам нужно добавить условие else .

colQuanJour.setCellFactory( 
               new Callback<TableColumn<Log,Integer>,TableCell<Log,Integer>>(){
           @Override
           public TableCell<Log, Integer> call(TableColumn<Log, Integer> param) {
              return new TableCell<Log, Integer>(){
                  @Override
                  protected void updateItem(Integer item, boolean empty) {
                      if( ! empty){
                          // Your code...
                          setText(Char+val);
                      }else{
                          setText(null); // This will clear the text for empty rows
                      }
                  }
              };
           }
        });
...