1 回答

TA贡献1921条经验 获得超9个赞
的selectionModelProperty时候才会触发改变selectionModel被替换这通常不会发生。依赖关系应该是sourceList.getSelectionModel().getSelectedItems().
此外,按照我的理解,您应该查询Log'ssource是否在所选项目中,而不是该source字符串是否在所选项目列表中的某个位置包含字符串的某些部分。
另请注意,ListView应避免仅使用 a来存储数据,对于大型列表,contains对 aSet而不是 a进行检查效率更高List。
你可以使用这样的代码:
ObjectBinding<Predicate<Log>> binding = new ObjectBinding<Predicate<String>>() {
private final Set<String> strings = new HashSet<>();
{
sourceList.getSelectionModel().getSelectedItems().addListener(new ListChangeListener<String>() {
@Override
public void onChanged(ListChangeListener.Change<? extends String> c) {
boolean changed = false;
// modify set on selection change
while (c.next()) {
if (c.wasRemoved()) {
changed = true;
c.getRemoved().stream().map(String::toLowerCase).forEach(strings::remove);
}
if (c.wasAdded()) {
changed = true;
c.getAddedSubList().stream().map(String::toLowerCase).forEach(strings::add);
}
}
if (changed) {
invalidate();
}
}
});
}
@Override
protected Predicate<Log> computeValue() {
return log -> strings.contains(log.getSource().toLowerCase());
}
};
sourceFilter.bind(binding);
添加回答
举报