Удаление выбранного элемента в ListView в javafx

У меня есть ListView с элементами, и разработал функцию удаления, которая удаляет элемент. Проблема, с которой я сталкиваюсь, состоит в том, что, когда я удаляю элемент, элемент ниже также удаляется.

Чтобы дать вам лучшее понимание. например:

Если у меня есть 5 элементов в списке, и я выбираю и удаляю "элемент 2", то элементы 2 и 3 удаляются. А пункты 1, 4 и 5 остаются в списке. Если я удаляю последний элемент в списке, то элемент удаляется, и я получаю java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

Вот мой код:

    public void handleDeleteButton() {
    btnDelete.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            final int selectedIdx = playerList.getSelectionModel().getSelectedIndex();
            if (selectedIdx != -1) {
                String itemToRemove = playerList.getSelectionModel().getSelectedItem();

                final int newSelectedIdx =
                        (selectedIdx == playerList.getItems().size() - 1)
                                ? selectedIdx - 1
                                : selectedIdx;

                playerList.getItems().remove(selectedIdx);
                playerList.getSelectionModel().select(newSelectedIdx);
                //removes the player for the array
                System.out.println("selectIdx: " + selectedIdx);
                System.out.println("item: " + itemToRemove);
                players.remove(selectedIdx);

            }
        }
    });
}

Я хочу удалить только выбранный элемент. Как я могу это сделать? А как сделать таблицу мультиселекционной?

players это список игроков, используемых в ListView,

2 ответа

Решение

Вы удаляете 2 элемента из списка, используя следующие строки:

playerList.getItems().remove(selectedIdx);
        // ^ this should return players
players.remove(selectedIdx);

Удалить один из них.

Чтобы разрешить множественный выбор, установите MultipleSelectionModel.selectionMode в SelectionMode.MULTIPLE,

final int newSelectedIdx =
                        (selectedIdx == playerList.getItems().size() - 1)
                                ? selectedIdx - 1
                                : selectedIdx;

                playerList.getItems().remove(selectedIdx);
  1. Как видите, однажды newSelectedIdx назначается, затем вы пытаетесь удалить selectedIdx, Иногда, newSelectedIdx будет таким же как selectedIdx, Вот почему, даже если вы намереваетесь удалить один элемент, другой элемент также удаляется.
  2. Предположим, у вас есть только один элемент, вы удалите этот элемент и затем выберите его, вы получите indexOutofBoundsException

Что вы можете сделать, так это то, что удаляющая логика может быть изолирована в handleDeleteButton(). Событие выбора может быть обработано каким-либо другим методом, чтобы вы не смешивали удаление и выбор в той же функции.

Другие вопросы по тегам