JavaFX не может очистить элементы из списка - PullRequest
0 голосов
/ 15 ноября 2018

Я использую 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, чтобы лучше объяснить проблему: Adding and clearing items

Спасибо!

Редактировать: Похоже, что проблема в основном связана с этим сегментом

StringBinding stringBinding = new StringBinding() {
                {
                    super.bind(cell.itemProperty().asString());
                }

                @Override
                protected String computeValue() {
                    if (cell.itemProperty().getValue() == null) {
                        return "";
                    }
                    return cell.itemProperty().getValue().getTitle();
                }
            };

Похоже, что, несмотря на то, что предметы есть, они имеют пустой заголовок дисплея

1 Ответ

0 голосов
/ 15 ноября 2018

Если вы используете 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("");
                }
            }
        };

Кажется, что ваш рабочий процесс связывания создает ненужную зависимость, которая блокирует удаление.


PS: почему вы используете привязку для статического текста в deleteItem?Просто назначьте значение напрямую:

        MenuItem deleteItem = new MenuItem();
        deleteItem.setText("Delete item");
...