我在项目中使用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();
}
};
似乎即使这些项目在那里,它们的显示标题还是空的
答案 0 :(得分:2)
如果您使用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("");
}
}
};
您的绑定工作流程似乎创建了不必要的依赖性,从而阻止了删除。
附言:为什么对deleteItem
中的静态文本使用绑定?只需直接分配值即可:
MenuItem deleteItem = new MenuItem();
deleteItem.setText("Delete item");