JavaFX:ListChangeListener中的每个更改都只有一种类型的更改

时间:2018-02-13 06:23:36

标签: java javafx

只是想知道Change中的每个ListChangeListener对象是否只包含一种类型的更改。

while (c.next() {
    if (c.wasAdded()) {
    }
    if (c.wasRemoved()) {
    }
    if (c.wasUpdated()) {
    }
    if (c.wasPermutated()) {
    }
    if (c.wasReplaced()) {
    }
}

while (c.next() {
    if (c.wasAdded()) {
    }
    else if (c.wasRemoved()) {
    }
    else if (c.wasUpdated()) {
    }
    else if (c.wasPermutated()) {
    }
    else if (c.wasReplaced()) {
    }
}

这两者之间是否存在差异,哪种方式更受欢迎?

2 个答案:

答案 0 :(得分:1)

在kleopatra的帮助下,我找到了答案。它实际上位于ListChangeListener.Change的{​​{3}},但解释隐藏在底部。

  

注意:如果更改包含多个不同类型的更改,   这些更改必须按以下顺序排列:排列更改,   添加或删除更改,更新更改这是因为排列   添加/删除更改后,更改无法进行,因为它们会更改   添加元素的位置。另一方面,必须更新更新   继续添加/删除更改,因为它们引用了索引   列表的当前状态,表示所有添加/删除更改   应用

实际上有一件令人困惑的事情。这个说明告诉我们做排列 - >添加/删除 - >更新,但给出的例子是置换 - >更新 - >添加/删除。我已经确定解释所给出的顺序肯定更有意义。此外,该示例显示这3种主要类型的更改永远不会发生在单个Change对象中,这与解释所说的相矛盾。

所以我的结论是:

  1. 将每个Change对象视为可以在单个对象中具有所有类型的更改。这意味着应该避免使用else if
  2. 如果您打算处理所有类型的更改,那么您应该按排列顺序处理 - >添加/删除 - >更新。我会假设添加和删除的顺序不重要,但因为"替换"改变的类型,我认为在添加之前处理删除更安全。
  3. "替换"更改类型可以忽略,因为它等同于删除+添加。

答案 1 :(得分:1)

ListChangeListener.Change可以包含任意组合的更改类型。共有3组状态互斥:

  1. 排列更改
  2. 添加/删除/替换更改
  3. 更新更改
  4. 使用ListChangeListener.Change.next()迭代这些状态。发生这些更改的顺序与上面的列表中的顺序相同:首先遍历所有排列更改,然后通过添加/删除/替换更改以及最后更新更改。

    这意味着您可以使用以下代码:

    while (c.next()) {
        if (c.wasReplaced()) {
            // ...
        } else if (c.wasAdded()) {
            // ...
        } else if (c.wasRemoved()) {
            // ...
        } else if (c.wasPermutated()) {
            // ...
        } else if (c.wasUpdated()) {
            // ...
        }
    }
    

    只要在检查添加和删除之前检查替换更改,就可以对if/else if中的检查重新排序,因为替换更改意味着wasRemovedwasAdded都会产生true。 (在您的第二个代码段中不是这种情况。)

    或者,如果您不需要区分添加,删除和替换:

    while (c.next()) {
        if (c.wasPermutated()) {
            // ...
        } else if (c.wasUpdated()) {
            // ...
        } else {
            // Handle add/remove/replace change
        }
    }