ListView CellFactory - 如何正确删除单元格?
ListView CellFactory - How to remove cells correctly?
我有一个 ListView
,我正在努力添加一个 ContextMenu
。我有 ContextMenu
工作发现但有另一个问题。
我的 setCellFactory
代码,用于设置上下文菜单:
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;
});
我的 ListView
可以通过 TextField
与听众一起搜索;侦听器在用户输入时过滤 ListView
中的项目。
现在的问题是,在筛选列表时,任何空单元格现在都显示 null
。
通过阅读另一个 question,我相当有信心 ListView
仍在显示已删除单元格的图形。我知道如何通过覆盖 updateItem
方法在 ListView 中处理它,但是我将如何从我的 setCellFactory
方法中处理它?
这是否可能,或者我是否需要重构我的整个 ListView
?
一如既往地感谢您的帮助!
问题出在线路
cell.textProperty().bind(cell.itemProperty().asString());
当单元格为空时,该项目将为空,因此绑定将(我相信)评估为字符串 "null"
。
尝试测试单元格是否为空或项目是否为空,例如
cell.textProperty().bind(Bindings
.when(cell.emptyProperty())
.then("")
.otherwise(cell.itemProperty().asString()));
或者(感谢@fabian 改进了这个版本)
cell.textProperty().bind(Bindings.createStringBinding(
() -> Objects.toString(cell.getItem(), ""),
cell.itemProperty()));
我有一个 ListView
,我正在努力添加一个 ContextMenu
。我有 ContextMenu
工作发现但有另一个问题。
我的 setCellFactory
代码,用于设置上下文菜单:
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;
});
我的 ListView
可以通过 TextField
与听众一起搜索;侦听器在用户输入时过滤 ListView
中的项目。
现在的问题是,在筛选列表时,任何空单元格现在都显示 null
。
通过阅读另一个 question,我相当有信心 ListView
仍在显示已删除单元格的图形。我知道如何通过覆盖 updateItem
方法在 ListView 中处理它,但是我将如何从我的 setCellFactory
方法中处理它?
这是否可能,或者我是否需要重构我的整个 ListView
?
一如既往地感谢您的帮助!
问题出在线路
cell.textProperty().bind(cell.itemProperty().asString());
当单元格为空时,该项目将为空,因此绑定将(我相信)评估为字符串 "null"
。
尝试测试单元格是否为空或项目是否为空,例如
cell.textProperty().bind(Bindings
.when(cell.emptyProperty())
.then("")
.otherwise(cell.itemProperty().asString()));
或者(感谢@fabian 改进了这个版本)
cell.textProperty().bind(Bindings.createStringBinding(
() -> Objects.toString(cell.getItem(), ""),
cell.itemProperty()));