JavaFX 无法清除列表视图中的项目
JavaFX can not clear items from listview
我在我的项目中使用 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;
});
然而,在清除 post 列表后 - 尽管项目似乎已被删除 - 当添加另一个时,所有已删除的项目 re-appear 并且不显示要添加的项目。
任何可能导致此问题的项目?它只在我设置电池工厂时发生,否则没问题。
我录制了一个小 gif 以帮助更好地解释问题:
谢谢!
编辑:看来问题主要与这一段有关
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("");
}
}
};
您的绑定工作流程似乎创建了一个不必要的依赖项,会阻止删除。
P.S.: 为什么在deleteItem
中对静态文本使用绑定?直接赋值即可:
MenuItem deleteItem = new MenuItem();
deleteItem.setText("Delete item");
我在我的项目中使用 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;
});
然而,在清除 post 列表后 - 尽管项目似乎已被删除 - 当添加另一个时,所有已删除的项目 re-appear 并且不显示要添加的项目。
任何可能导致此问题的项目?它只在我设置电池工厂时发生,否则没问题。
我录制了一个小 gif 以帮助更好地解释问题:
谢谢!
编辑:看来问题主要与这一段有关
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("");
}
}
};
您的绑定工作流程似乎创建了一个不必要的依赖项,会阻止删除。
P.S.: 为什么在deleteItem
中对静态文本使用绑定?直接赋值即可:
MenuItem deleteItem = new MenuItem();
deleteItem.setText("Delete item");