在 javafx 中删除 ListView 上的选定项目
Deleting a selected item on ListView in javafx
我有一个 ListView
项目,并开发了一个删除项目的删除功能。我面临的问题是当我删除一个项目时,下面的项目也会被删除。
为了让你更好的理解。例如:
如果我在列表中有 5 个项目并且我 select 并删除了 "item 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);
}
}
});
}
我只想删除 selected 项目。我怎么做?以及如何使 table multi selectable?
players
是 ListView
.
中使用的玩家列表
final int newSelectedIdx =
(selectedIdx == playerList.getItems().size() - 1)
? selectedIdx - 1
: selectedIdx;
playerList.getItems().remove(selectedIdx);
- 如您所见,分配
newSelectedIdx
后,您尝试删除 selectedIdx
。有时,newSelectedIdx
与 selectedIdx
相同。这就是为什么即使您打算删除一个项目,其他项目也会被删除的原因。
- 假设你只剩下一个项目,你将删除那个项目然后 select 它,你将得到 indexOutofBoundsException
您可以做的是将删除逻辑隔离在 handleDeleteButton() 中。 selection 事件可以用其他方法处理,这样您就不会在同一函数中混淆 delete 和 select。
您使用以下行从列表中删除了 2 项:
playerList.getItems().remove(selectedIdx);
// ^ this should return players
players.remove(selectedIdx);
删除其中一个。
要允许多选,设置MultipleSelectionModel.selectionMode
to SelectionMode.MULTIPLE
。
我有一个 ListView
项目,并开发了一个删除项目的删除功能。我面临的问题是当我删除一个项目时,下面的项目也会被删除。
为了让你更好的理解。例如:
如果我在列表中有 5 个项目并且我 select 并删除了 "item 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);
}
}
});
}
我只想删除 selected 项目。我怎么做?以及如何使 table multi selectable?
players
是 ListView
.
final int newSelectedIdx =
(selectedIdx == playerList.getItems().size() - 1)
? selectedIdx - 1
: selectedIdx;
playerList.getItems().remove(selectedIdx);
- 如您所见,分配
newSelectedIdx
后,您尝试删除selectedIdx
。有时,newSelectedIdx
与selectedIdx
相同。这就是为什么即使您打算删除一个项目,其他项目也会被删除的原因。 - 假设你只剩下一个项目,你将删除那个项目然后 select 它,你将得到 indexOutofBoundsException
您可以做的是将删除逻辑隔离在 handleDeleteButton() 中。 selection 事件可以用其他方法处理,这样您就不会在同一函数中混淆 delete 和 select。
您使用以下行从列表中删除了 2 项:
playerList.getItems().remove(selectedIdx);
// ^ this should return players
players.remove(selectedIdx);
删除其中一个。
要允许多选,设置MultipleSelectionModel.selectionMode
to SelectionMode.MULTIPLE
。