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