gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:22:53 25 4
gpt4 key购买 nike

如果我有一个包含 4 个对象(并非全部相同)的列表,并且我调用 JavaFX 的listView.getItems().removeAll(listView.getSelectionModel().getSelectedItems()) 一个对象(比方说编号 1)被选中,对象 2 和 3 也将被删除。这是 removeAll() 的正常操作吗?它导致了一个相当令人沮丧的错误。这在 removeAll() 方法中没有记录,并且相当具有误导性,因为我使用它是因为它比普通的 remove 方法具有更好的类型安全性,后者采用 对象

最佳答案

当您删除一个选定的项目时,该选择将被更新,以便其他一些项目将被选中。更新选择时,这会产生更新 listView.getSelectionModel().getSelectedItems() 返回的列表的副作用。这与 List.removeAll 方法的交互很糟糕。

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

更具体地说:

  1. 这从元素 0 开始。因为这个元素没有出现在 removeList 中,所以没有任何反应。

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

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

  4. 我想您现在可以看到发生了什么。 :-)

可能最简单的方法是在将选择列表传递给 removeAll 之前复制选择列表:

list.getItems().removeAll(new ArrayList<>(list.getSelectionModel().getSelectedItems()));

关于java - 来自 ListView.getItems().removeAll() 的可疑行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23985809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com