如果我有一个包含4个对象(不完全相同)的列表,并且我选择了一个对象(让我们说数字1)选择了JavaFX' listView.getItems().removeAll(listView.getSelectionModel().getSelectedItems())
,对象2和3也将被删除。这是removeAll()
的正常操作吗?这导致了一个相当令人沮丧的错误。这在removeAll()
方法中未记录,并且具有误导性,因为我使用它,因为它比普通的remove
方法具有更好的类型安全性,该方法需要Object
。
答案 0 :(得分:3)
删除所选项目时,将更新选择,以便选择其他项目。更新选择后,这会产生更新{{1}}返回的列表的副作用。这与listView.getSelectionModel().getSelectedItems()
方法的交互很糟糕。
假设我们有List.removeAll
。会发生什么情况,对于targetList.removeAll(removeList)
中的每个元素,代码会询问“此元素是否显示在targetList
?”如果是,则从removeList
中删除该元素。这会对targetList
产生副作用,这会在下次循环时改变行为。
更具体地说:
这从元素0开始。由于此元素未出现在removeList
中,因此没有任何反应。
接下来是元素1.由于它被选中,它出现在removeList
中,因此删除了元素1。 removeList
代码检测到所选元素已被删除,因此它将选择更新为元素2.这意味着ListView
现在包含元素2 。
接下来是元素2.由于它被选中,它出现在removeList
中,因此元素2被删除。 removeList
代码检测到所选元素已被删除,因此它将选择更新为元素3.这意味着ListView
现在包含元素3 。
我想你现在可以看到发生了什么。 : - )
可能最简单的方法是复制选择列表,然后再将其传递给removeList
:
removeAll