在javafx中删除ListView上的选定项目

时间:2016-03-26 18:09:05

标签: listview javafx cell rowdeleting

我有ListView个项目,并开发了删除该项目的删除功能。我面临的问题是当我删除一个项目时,下面的项目也会被删除。

让您更好地理解。例如:

如果我在列表中有5个项目,我选择并删除"项目2",则项目2& 3被删除。和第1,4和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);

            }
        }
    });
}

我只想删除所选项目。我怎么做?你如何使表格多选?

playersListView中使用的玩家列表。

2 个答案:

答案 0 :(得分:3)

您可以使用以下行从列表中删除2个项目:

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

删除其中一个。

要允许多项选择,请将MultipleSelectionModel.selectionMode设置为SelectionMode.MULTIPLE

答案 1 :(得分:0)

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

                playerList.getItems().remove(selectedIdx);
  1. 如您所见,分配newSelectedIdx后,您尝试删除selectedIdx。有时,newSelectedIdx将与selectedIdx相同。这就是为什么即使你打算删除一个项目,其他项目也会被删除。
  2. 假设您只剩下一个项目,您将删除该项目然后选择它,您将获得indexOutofBoundsException
  3. 你可以做的是删除逻辑可以在handleDeleteButton()中隔离。选择事件可以用其他方法处理,这样就不会混淆删除和选择相同的函数。