Удаление выбранного элемента в 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);
- Как видите, однажды
newSelectedIdx
назначается, затем вы пытаетесь удалитьselectedIdx
, Иногда,newSelectedIdx
будет таким же какselectedIdx
, Вот почему, даже если вы намереваетесь удалить один элемент, другой элемент также удаляется. - Предположим, у вас есть только один элемент, вы удалите этот элемент и затем выберите его, вы получите indexOutofBoundsException
Что вы можете сделать, так это то, что удаляющая логика может быть изолирована в handleDeleteButton(). Событие выбора может быть обработано каким-либо другим методом, чтобы вы не смешивали удаление и выбор в той же функции.