来自ListView.getItems()的可疑行为.removeAll()

时间:2014-06-02 00:21:32

标签: java list generics user-interface javafx

如果我有一个包含4个对象(不完全相同)的列表,并且我选择了一个对象(让我们说数字1)选择了JavaFX' listView.getItems().removeAll(listView.getSelectionModel().getSelectedItems()),对象2和3也将被删除。这是removeAll()的正常操作吗?这导致了一个相当令人沮丧的错误。这在removeAll()方法中未记录,并且具有误导性,因为我使用它,因为它比普通的remove方法具有更好的类型安全性,该方法需要Object

1 个答案:

答案 0 :(得分:3)

删除所选项目时,将更新选择,以便选择其他项目。更新选择后,这会产生更新{​​{1}}返回的列表的副作用。这与listView.getSelectionModel().getSelectedItems()方法的交互很糟糕。

假设我们有List.removeAll。会发生什么情况,对于targetList.removeAll(removeList)中的每个元素,代码会询问“此元素是否显示在targetList?”如果是,则从removeList中删除该元素。这会对targetList产生副作用,这会在下次循环时改变行为。

更具体地说:

  1. 这从元素0开始。由于此元素未出现在removeList中,因此没有任何反应。

  2. 接下来是元素1.由于它被选中,它出现在removeList中,因此删除了元素1。 removeList代码检测到所选元素已被删除,因此它将选择更新为元素2.这意味着ListView 现在包含元素2

    < / LI>
  3. 接下来是元素2.由于它被选中,它出现在removeList中,因此元素2被删除。 removeList代码检测到所选元素已被删除,因此它将选择更新为元素3.这意味着ListView 现在包含元素3

    < / LI>
  4. 我想你现在可以看到发生了什么。 : - )

  5. 可能最简单的方法是复制选择列表,然后再将其传递给removeList

    removeAll