JavaFX搜索筛选器在结果中返回额外的空行

JavaFX搜索筛选器在结果中返回额外的空行,java,javafx,fxml,Java,Javafx,Fxml,我是javaFX新手。我正在尝试为我的表视图添加搜索筛选器。我已经实现了一些代码并成功地过滤了行。现在的问题是,我看到UI上显示了额外的空行 请看下图: 在下表中,您可以看到额外的空行。如果我继续添加搜索文本,空白行网格会上下移动。但一旦清除搜索文本,表视图中就没有这样的空行 请在下面找到我的搜索筛选器代码: private TableView<DTO> dataTable; private ObservableList<DTO> data = null; @FXML

我是javaFX新手。我正在尝试为我的表视图添加搜索筛选器。我已经实现了一些代码并成功地过滤了行。现在的问题是,我看到UI上显示了额外的空行

请看下图:

在下表中,您可以看到额外的空行。如果我继续添加搜索文本,空白行网格会上下移动。但一旦清除搜索文本,表视图中就没有这样的空行

请在下面找到我的搜索筛选器代码:

private TableView<DTO> dataTable;
private ObservableList<DTO> data = null;
@FXML
private TableColumn<DTO, String> nameColumn;
@FXML
private TableColumn<DTO, Boolean> userInAppColumn;
@FXML
private TableColumn<DTO, Boolean> mappedColumn;

FilteredList<DTO> filteredData = new FilteredList<>(data, p -> true);

        // 2. Set the filter Predicate whenever the filter changes.
        fieldSearch.textProperty().addListener((observable, oldValue, newValue) -> {
            filteredData.setPredicate(obj -> {
                // If filter text is empty, display all persons.
                if (newValue == null || newValue.isEmpty()) {
                    return true;
                }

                // Compare first name and last name field in your object with filter.
                String lowerCaseFilter = newValue.toLowerCase();

                if (String.valueOf(obj.getFriendlyName()).toLowerCase().contains(lowerCaseFilter)) {
                    return true;
                    // Filter matches first name.

                }
                return false; // Does not match.
            });
        });

        // 3. Wrap the FilteredList in a SortedList. 
        SortedList<DTO> sortedData = new SortedList<>(filteredData);

        // 4. Bind the SortedList comparator to the TableView comparator.
        sortedData.comparatorProperty().bind(dataTable.comparatorProperty());
        // 5. Add sorted (and filtered) data to the table.
        dataTable.setItems(sortedData);
  • 启用单元实现:

    setCellValueFactory(新属性ValueFactory(“启用”); makeCheckBoxHeader(userInAppColumn); userInAppColumn.setEditable(false)

    userInAppColumn.setCellFactory(新回调(){
    //@覆盖
    公共TableCell调用(TableColumn参数){
    TableCell单元格=新的TableCell(){
    @凌驾
    public void updateItem(布尔项,布尔空){
    如果(项!=null){
    HBox HBox=新的HBox();
    hbox.设置校准(位置中心);
    ImageView ImageView=新的ImageView();
    如果(项==真)
    setImage(新图像(getClass().getResourceAsStream(“/images/success.png”));
    其他的
    setImage(新图像(getClass().getResourceAsStream(“/images/blank.png”));
    hbox.getChildren().add(imageview);
    //设置所有图形组件
    设置图形(hbox);
    }
    }
    };
    返回单元;
    }
    });
    
  • 名称单元实现:

         nameColumn.setCellValueFactory(new PropertyValueFactory<DTO, String>("friendlyName"));
         nameColumn.setEditable(true);
         nameColumn.setCellFactory(TextFieldTableCell.forTableColumn());
    
         nameColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<DTO, String>>() {
             @Override
             public void handle(CellEditEvent<DTO, String> t) {
    
                 ((DTO) t.getTableView().getItems().get(t.getTablePosition().getRow())).setFriendlyName(t.getNewValue());
                 ((DTO) t.getTableView().getItems().get(t.getTablePosition().getRow())).setNameChanged(true);
                 ((DTO) t.getTableView().getItems().get(t.getTablePosition().getRow())).setOperation(UPDATE);
    
                 profileDirty = true;
                 updateProfilePageControls();
                 updateStatus("", true);
              }
         }); 
    
    nameColumn.setCellValueFactory(新的PropertyValueFactory(“friendlyName”);
    nameColumn.setEditable(true);
    nameColumn.setCellFactory(TextFieldTableCell.forTableColumn());
    nameColumn.setOnEditCommit(新的EventHandler(){
    @凌驾
    公共无效句柄(CellEditEvent t){
    ((DTO)t.getTableView().getItems().get(t.getTablePosition().getRow()).setFriendlyName(t.getNewValue());
    ((DTO)t.getTableView().getItems().get(t.getTablePosition().getRow()).setNameChanged(true);
    ((DTO)t.getTableView().getItems().get(t.getTablePosition().getRow()).setOperation(更新);
    profileDirty=true;
    updateProfilePageControls();
    updateStatus(“,true);
    }
    }); 
    

  • 请帮忙。我不想显示下面的行。

    请发布一条消息。这看起来与您发布的代码无关。很可能是您的计算单元实现中的问题。如前所述,在重写此方法以及调用
    super.updateItem(…)
    时,您应该始终调用
    super.updateItem(…)
    您的
    updateItem(…)
    实现必须覆盖所有情况,包括项为null(或单元格为空)时。您看到的是虚假的图形,因为当单元格变空时,您的代码不会重新绘制它们。如果
    item==null
    ,则应将图形设置为
    null
    (如果更改文本,则设置空白文本)。
         userInAppColumn.setCellFactory(new Callback<TableColumn<DTO, Boolean>, TableCell<DTO, Boolean>>() {
         // @Override
             public TableCell<DTO, Boolean> call(TableColumn<DTO, Boolean> param) {
                 TableCell<DTO, Boolean> cell = new TableCell<DTO, Boolean>() {
                     @Override
                     public void updateItem(Boolean item, boolean empty) {
                         if (item != null) {
                             HBox hbox = new HBox();
                             hbox.setAlignment(Pos.CENTER);
    
                             ImageView imageview = new ImageView();
                             if (item == true)
                                 imageview.setImage(new Image(getClass().getResourceAsStream("/images/success.png")));
                             else
                                 imageview.setImage(new Image(getClass().getResourceAsStream("/images/blank.png")));
    
                             hbox.getChildren().add(imageview);
    
                             // SETTING ALL THE GRAPHICS COMPONENT
                             setGraphic(hbox);
                         }
                     }
                 };
    
                 return cell;
             }
         });
    
         nameColumn.setCellValueFactory(new PropertyValueFactory<DTO, String>("friendlyName"));
         nameColumn.setEditable(true);
         nameColumn.setCellFactory(TextFieldTableCell.forTableColumn());
    
         nameColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<DTO, String>>() {
             @Override
             public void handle(CellEditEvent<DTO, String> t) {
    
                 ((DTO) t.getTableView().getItems().get(t.getTablePosition().getRow())).setFriendlyName(t.getNewValue());
                 ((DTO) t.getTableView().getItems().get(t.getTablePosition().getRow())).setNameChanged(true);
                 ((DTO) t.getTableView().getItems().get(t.getTablePosition().getRow())).setOperation(UPDATE);
    
                 profileDirty = true;
                 updateProfilePageControls();
                 updateStatus("", true);
              }
         });