当前位置: 首页 > 知识库问答 >
问题:

ListView CellFactory-如何正确删除单元格?

顾学真
2023-03-14

我有一个列表视图,我正在向其中添加一个上下文菜单。我有“工作查找”上下文菜单,但有另一个问题。

MysetCellFactory代码,用于设置上下文菜单:

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可以通过侦听器通过文本字段进行搜索;当用户键入时,侦听器会过滤列表视图中的项目。

现在的问题是,在筛选列表时,所有空单元格现在都显示为null。

通过阅读另一个问题,我非常确信ListView仍在显示已删除单元格的图形。我知道如何通过重写updateItem方法在ListView中处理这个问题,但是我应该如何在setCellFactory方法中处理这个问题呢?

这是可能的还是我需要重构整个列表视图?

一如既往地感谢您的帮助!

共有1个答案

锺离边浩
2023-03-14

问题出在线路上

cell.textProperty().bind(cell.itemProperty().asString());

当单元格为空时,项将为null,因此绑定将(我相信)计算为字符串“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()));
 类似资料:
  • 对于类中的方法,文档是这样说的: 取消此对话框,将其从屏幕上移除。可以从任何线程安全地调用此方法。请注意,当对话框被取消时,不应重写此方法来进行清理,而应在中实现此方法。 在我的代码中,我所做的就是调用来删除它。但是我没有做其他任何事情,甚至没有使用。因此,我问的是如何正确地删除以避免任何内存泄漏等。

  • 我在使用org.apache.commons.io.FileUtils从img目录删除文件时遇到问题。我正在使用以下代码: 实际上,该代码是用来替换img目录中已有的图像文件。我需要删除所有以前存在的文件,名称是n.*,与新文件,例如n.png。如果我试图删除图像文件,我会得到变量成功的false值,并且文件不会被删除。但不包括图像文件,例如*.abc;*.ACD;*.ACDC等被成功删除。这个问

  • 问题内容: 我正在尝试从ArrayList中删除一个对象。每个Item对象都有3个属性;1. itemNum 2.信息3.费用。我也有3个类,即1。Item类定义了存储在目录中的单个项目。2. Catalog类维护Item对象的列表。3带main方法的客户端类。我在Set类中具有设置并获取,在Catalog中具有ArrayList。在客户端中,提示我“输入要删除的itemNum。如何基于对item

  • 本文向大家介绍java 如何实现正确的删除集合中的元素,包括了java 如何实现正确的删除集合中的元素的使用技巧和注意事项,需要的朋友参考一下 在java中如果我们需要遍历集合并删除其中的某些元素时,例如对于List来说,我们有三种办法。 1. 普通的for循环遍历并删除 main中调用 程序输出[1,2,3] 这是因为,删除时改变了list的长度。删除第一个2后,长度变为了3,这时list.ge

  • 我有一个工作表,我需要根据单元格值删除行。。 要检查的单元格位于A列中。。 如果单元格包含“-”。。删除行 我找不到这样做的方法...我打开一个工作簿,将所有内容复制到另一个工作簿,然后删除整个行和列,但必须根据单元格值删除特定的行。 这里需要帮助。 更新 我拥有的数据样本