我最近遇到了有趣的问题。我有一个包含1个int和3个String列的表。我已经为表格实现了完全正常的过滤,除了一个小点:每当至少有一个过滤结果(但小于可见行的数量)时,int列显示空值作为空行的值。但是,如果找到的匹配数量大于可见行数,则不会添加空值(即使使用滚动功能)。最好用图片描述:
筛选不存在的值不显示空值:
过滤代码:
FilteredList<Word> filteredData = new FilteredList<>(masterData,e->true);
SortedList<Word> sortedData = new SortedList<>(filteredData);
sortedData.comparatorProperty().bind(table.comparatorProperty());
table.setItems(sortedData);
TextField filter = new TextField();
filter.setPromptText("Filter");
filter.textProperty().addListener((observableValue,oldValue,newValue)->{
filteredData.setPredicate((Predicate<? super Word>) word->{
if(word.getAllCz().toLowerCase().contains(newValue.toLowerCase()))return true;
else if(word.getAllEng().toLowerCase().contains(newValue.toLowerCase()))return true;
else if(String.valueOf(word.getUnitNo()).equals(newValue))return true;
else return false;
});
});
CellValue工厂:
column.setCellValueFactory(new PropertyValueFactory<>(data));
column.setCellFactory(tc-> {
TableCell<Word, Integer> cell = new TableCell<>();
Text text = new Text();
cell.setGraphic(text);
text.setTextAlignment(TextAlignment.CENTER);
text.setStyle("-fx-fill: -fx-text-background-color;");
text.setFontSmoothingType(FontSmoothingType.LCD);
text.wrappingWidthProperty().bind(column.widthProperty().subtract(5));
text.textProperty().bind(cell.itemProperty().asString());
return cell;
});
答案 0 :(得分:1)
如果单元格为空,则其项目为null
,itemProperty().asString()
将评估为包含文字词的字符串&#34; null&#34; (类似于将空值传递给PrintStream
)。您的绑定需要将空单元格视为特殊情况:
column.setCellFactory(tc-> {
TableCell<Word, Integer> cell = new TableCell<>();
Text text = new Text();
cell.setGraphic(text);
text.setTextAlignment(TextAlignment.CENTER);
text.setStyle("-fx-fill: -fx-text-background-color;");
text.setFontSmoothingType(FontSmoothingType.LCD);
text.wrappingWidthProperty().bind(column.widthProperty().subtract(5));
text.textProperty().bind(Bindings.createStringBinding(() -> {
if (cell.isEmpty()) {
return null ;
} else {
return cell.getItem().toString();
}
}, cell.emptyProperty(), cell.itemProperty()));
return cell;
});
或者您需要覆盖updateItem()
:
column.setCellFactory(tc-> {
TableCell<Word, Integer> cell = new TableCell<>() {
private Text text = new Text();
{
this.setGraphic(text);
text.setTextAlignment(TextAlignment.CENTER);
text.setStyle("-fx-fill: -fx-text-background-color;");
text.setFontSmoothingType(FontSmoothingType.LCD);
text.wrappingWidthProperty().bind(column.widthProperty().subtract(5));
}
@Override
protected void updateItem(Integer item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
text.setText(null);
} else {
text.setText(item.toString());
}
}
};
return cell;
});