Search code examples
listviewjavafxcellrowdeleting

Deleting a selected item on ListView in javafx


I have an ListView with items, and developed a delete function which deletes the item. The problem Im facing is when I delete an item, the item below gets deleted as well.

To give you a better understanding. ex:

If I have 5 items in a list and I select and delete "item 2", then item 2 & 3 gets deleted. And items 1, 4 & 5 remains on the list view. If I delete the last item on the list then the item gets deleted and I get a java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

Here is my code:

    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);

            }
        }
    });
}

I want only the selected item to be deleted. How do I do that? And how do you make the table multi selectable?

players is the list of players used in the ListView.


Solution

  • You remove 2 items from the list using the following lines:

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

    Remove one of them.

    To allow multiple selection, set MultipleSelectionModel.selectionMode to SelectionMode.MULTIPLE.