java - JavaFX 无法从列表视图中清除项目
问题描述
我在我的项目中使用 ListView 并希望为每个列表项添加一个上下文菜单,以便可以单独删除每个列表项。使用以下代码时,这似乎工作得很好:
postList.setCellFactory(lv -> {
ListCell<Result> cell = new ListCell<>();
ContextMenu contextMenu = new ContextMenu();
StringBinding stringBinding = new StringBinding() {
{
super.bind(cell.itemProperty().asString());
}
@Override
protected String computeValue() {
if (cell.itemProperty().getValue() == null) {
return "";
}
return cell.itemProperty().getValue().getTitle();
}
};
cell.textProperty().bind(stringBinding);
MenuItem deleteItem = new MenuItem();
deleteItem.textProperty().bind(Bindings.format("Delete item"));
deleteItem.setOnAction(event -> postList.getItems().remove(cell.getItem()));
contextMenu.getItems().addAll(openPermalink, openSubreddit, openURL, deleteItem);
cell.emptyProperty().addListener((obs, wasEmpty, isNowEmpty) -> {
if (isNowEmpty) {
cell.setContextMenu(null);
} else {
cell.setContextMenu(contextMenu);
}
});
return cell;
});
但是,在清除帖子列表后 - 尽管项目似乎已被删除 - 当添加另一个时,所有已删除的项目都会重新出现,并且要添加的项目不会显示。
任何可能导致此问题的项目?只有当我设置单元工厂时才会发生这种情况,否则就可以了。
谢谢!
编辑:看来问题主要与此部分有关
StringBinding stringBinding = new StringBinding() {
{
super.bind(cell.itemProperty().asString());
}
@Override
protected String computeValue() {
if (cell.itemProperty().getValue() == null) {
return "";
}
return cell.itemProperty().getValue().getTitle();
}
};
似乎即使项目在那里,它们也有一个空的显示标题
解决方案
如果您使用ListCell.updateItem()
工作流而不是StringBinding
它应该可以工作:
ListCell< Result > cell = new ListCell< Result >() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item.getValue());
} else {
setText("");
}
}
};
您的绑定工作流程似乎创建了阻止删除的不必要的依赖项。
PS:为什么你在静态文本中使用绑定deleteItem
?直接赋值即可:
MenuItem deleteItem = new MenuItem();
deleteItem.setText("Delete item");