ListView CellFactory-如何正确删除单元格?
我有一个ListView CellFactory-如何正确删除单元格?,listview,javafx,listviewitem,Listview,Javafx,Listviewitem,我有一个列表视图,我正在为它添加一个上下文菜单。我有上下文菜单正在查找,但还有另一个问题 MysetCellFactorycode,用于设置上下文菜单: lvAppetites.setCellFactory(lv -> { ListCell<Appetite> cell = new ListCell<>(); ContextMenu contextMenu = new ContextMenu(); MenuItem editAppetite
列表视图
,我正在为它添加一个上下文菜单
。我有上下文菜单
正在查找,但还有另一个问题
MysetCellFactory
code,用于设置上下文菜单:
lvAppetites.setCellFactory(lv -> {
ListCell<Appetite> cell = new ListCell<>();
ContextMenu contextMenu = new ContextMenu();
MenuItem editAppetiteMenu = new MenuItem();
editAppetiteMenu.textProperty().bind(Bindings.format("Edit ..."));
editAppetiteMenu.setOnAction(event -> {
// Code to load the editor window
editAppetite(cell.getItem());
});
contextMenu.getItems().add(editAppetiteMenu);
MenuItem deleteAppetiteMenu = new MenuItem();
deleteAppetiteMenu.textProperty().bind(Bindings.format("Delete ..."));
deleteAppetiteMenu.setOnAction(event -> {
// Code to delete the appetite
});
contextMenu.getItems().add(deleteAppetiteMenu);
contextMenu.getItems().add(new SeparatorMenuItem());
MenuItem addAppetiteMenu = new MenuItem();
addAppetiteMenu.textProperty().bind(Bindings.format("Add New ..."));
addAppetiteMenu.setOnAction(event -> {
// Code to delete the appetite
});
contextMenu.getItems().add(addAppetiteMenu);
cell.textProperty().bind(cell.itemProperty().asString());
// If nothing selected, remove the context menu
cell.emptyProperty().addListener((obs, wasEmpty, isNowEmpty) -> {
if (isNowEmpty) {
cell.setContextMenu(null);
} else {
cell.setContextMenu(contextMenu);
}
});
return cell;
});
lvAppetites.setCellFactory(lv->{
ListCell,我非常确信,ListView
仍在显示已删除单元格的图形。我知道如何通过覆盖updateItem
方法在ListView中处理该问题,但如何从setCellFactory
方法中处理该问题
这是可能的还是我需要重构我的整个列表视图
一如既往地感谢您的帮助!问题源于线路
cell.textProperty().bind(cell.itemProperty().asString());
当单元格为空时,项将为null,因此绑定将(我相信)计算为字符串“null”
尝试测试单元格是否为空或项是否为空的内容,例如
cell.textProperty().bind(Bindings
.when(cell.emptyProperty())
.then("")
.otherwise(cell.itemProperty().asString()));
或者(感谢@fabian改进了这个版本)
为什么不在updateItem
代码中处理支持列表单元格的项目的更新(包括项目删除,因为它们也注册为更新),而不是尝试在单元格工厂中内联进行更新?覆盖updateItem
并处理任何逻辑都将是“标准”的实现这一点的方法,而不是通过绑定和侦听器。谢谢你,@James_D,一如既往。我以前从未见过时的/范式。
cell.textProperty().bind(Bindings.createStringBinding(
() -> Objects.toString(cell.getItem(), ""),
cell.itemProperty()));