【发布时间】:2017-10-10 16:32:25
【问题描述】:
我最近遇到了一个有趣的问题。我有一个包含 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;
});
【问题讨论】:
-
请包含设置第一列 cellValueFactory 的代码。
-
您在该列上有自定义单元工厂吗?如果是这样,请发布它。旁白:您是否意识到您正在不断地向文本字段的文本属性添加越来越多的侦听器?最终这将使应用程序停止。每次文本更改时也无需创建新的排序列表。
-
我添加了一个 cellValueFactory。 James_D 感谢您指出这一点。我还是新手,所以我没有注意到。
-
@kleopatra 我不太明白你的意思。能详细解释一下吗?
-
嗯,由于 james_d 的回答,我想我已经做到了。我已经编辑了问题以反映我现在拥有的代码。