【问题标题】:JavaFX can not clear items from listviewJavaFX 无法从列表视图中清除项目
【发布时间】:2018-11-15 19:09:02
【问题描述】:

我在我的项目中使用 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;
        });

但是,在清除帖子列表后 - 尽管项目似乎已被删除 - 当添加另一个时,所有已删除的项目都会重新出现,并且要添加的项目不会显示。

任何可能导致此问题的项目?只有在我设置单元工厂时才会发生这种情况,否则就可以了。

我录制了一个小 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();
                }
            };

看起来,即使项目在那里,它们的显示标题也是空的

【问题讨论】:

标签: java listview javafx fxml


【解决方案1】:

如果您使用 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");

【讨论】:

  • 这似乎已经解决了问题,感谢您的解决方案和建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 2016-09-21
相关资源
最近更新 更多