Module  javafx.base
软件包  javafx.collections

Class ListChangeListener.Change<E>

  • 参数类型
    E - 列表元素类型
    Enclosing interface:
    ListChangeListener < E >


    public abstract static class ListChangeListener.Change<E>
    extends Object
    表示对Observablelist进行的更改的报告。 更改可能包含一个或多个实际更改,并且必须由next()方法迭代。 每个更改必须是以下之一:
    • 在这种情况下, 排列变化wasPermutated()返回true。 排列发生在from (含)和to (独家)之间,可通过拨打getPermutation(int)查询。
    • 添加或删除的变化 :在这种情况下,至少一个wasAdded()wasRemoved()返回true。 如果两个方法都返回true, 那么wasReplaced()也将返回true。

      getRemoved()方法返回已从列表中替换或删除的元素列表。

      from (含)和to (独占)之间的范围表示包含新元素的列表的子列表。 请注意,这是一个半开的间隔,因此如果没有添加元素,则getFrom()等于getTo()

      可以通过调用getAddedSubList()获取添加元素的列表。

      请注意,为了保持单独添加/删除更改的正确索引,这些更改必须按照其from索引进行排序。

    • 更新更改wasUpdated()在更新更改时返回true。 from (含)和to (独家)之间的所有元素已更新。
    重要提示:这是需要调用next()调用其他任何方法之前方法Change 调用reset()后也一样 唯一可以随时使用的方法是getList()

    典型的用法是观察ObservableList上的变化,以便挂钩或取消挂起(或添加或删除侦听器)或为了在该ObservableList中的每个元素上维护一些不变量。 这样做的常见代码模式如下所示:

     ObservableList<Item> theList = ...;
    
     theList.addListener(new ListChangeListener<Item>() {
         public void onChanged(Change<tem> c) {
             while (c.next()) {
                 if (c.wasPermutated()) {
                         for (int i = c.getFrom(); i < c.getTo(); ++i) {
                              //permutate
                         }
                     } else if (c.wasUpdated()) {
                              //update item
                     } else {
                         for (Item remitem : c.getRemoved()) {
                             remitem.remove(Outer.this);
                         }
                         for (Item additem : c.getAddedSubList()) {
                             additem.add(Outer.this);
                         }
                     }
                 }
             }
         });
    
     }

    警告:此类直接访问源列表以获取有关更改的信息。
    当列表中发生另一个更改时,这会使“更改”对象无效。
    因此, 在不同的线程上使用这个类不安全的
    这也意味着不能在监听器内修改源列表,因为这将使所有后续监听器的此Change对象无效。

    注意:如果更改包含不同类型的多个更改,则这些更改必须按照以下顺序排列排列更改,添加或删除更改,更新更改这是因为在添加/删除更改后排除更改不会如下改变添加元素的位置。 另一方面,更新更改必须在添加/删除更改后执行,因为它们将其索引引用到列表的当前状态,这意味着应用所有添加/删除更改。

    从以下版本开始:
    JavaFX 2.0
    • 构造方法详细信息

      • Change

        public Change​(ObservableList<E> list)
        构造一个新的列表更改。
        参数
        list - 那是改变了
    • 方法详细信息

      • next

        public abstract boolean next​()
        转到下一个变化。 初始状态的变化是无效的,在调用其他方法之前需要调用next()。 第一个next()调用将使该对象代表第一个更改。
        结果
        如果切换到下一个更改,则为true,如果最后一次更改则为false。
      • reset

        public abstract void reset​()
        重置到初始阶段。 在这个调用之后,在使用第一个更改之前必须调用next()。
      • getList

        public ObservableList<E> getList​()
        源列表的更改。
        结果
        已更改的列表
      • getFrom

        public abstract int getFrom​()
        如果wasAdded为true,则间隔包含所有添加的值。 如果wasPermutated为true,则间隔标记被排列的值。 如果wasRemoved为true并且wasAdded为false,则getFrom()和getTo()应返回相同的数字 - 删除的元素位于列表中的位置。
        结果
        与变化相关的间隔的开始(包括)
        异常
        IllegalStateException - 如果此更改处于初始状态
      • getTo

        public abstract int getTo​()
        更改间隔的结束。
        结果
        与更改相关的间隔的结束(排他)。
        异常
        IllegalStateException - 如果此更改处于初始状态
        另请参见:
        getFrom()
      • getRemoved

        public abstract List<E> getRemoved​()
        已删除/替换元素的不可变列表。 如果没有从列表中删除元素,则返回一个空列表。
        结果
        包含所有已删除元素的列表
        异常
        IllegalStateException - 如果此更改处于初始状态
      • wasPermutated

        public boolean wasPermutated​()
        指示更改是否只是一个排列。
        结果
        如果变化只是一个排列,则为真。
        异常
        IllegalStateException - 如果此更改处于初始状态
      • wasAdded

        public boolean wasAdded​()
        指示在此更改期间是否添加元素
        结果
        如果有人添加到列表中,则为true
        异常
        IllegalStateException - 如果此更改处于初始状态
      • wasRemoved

        public boolean wasRemoved​()
        表示在此更改期间元素是否被删除。 请注意,使用set也会产生一个更改,wasRemoved()返回true。 wasReplaced()
        结果
        如果从列表中删除某些内容,则为true
        异常
        IllegalStateException - 如果此更改处于初始状态
      • wasReplaced

        public boolean wasReplaced​()
        表示在此更改期间是否更换了元素。 在列表中调用set时通常为true。 设置操作将同时执行删除和添加操作。

        通常没有必要直接使用这种方法。 处理删除操作然后添加操作,如上例ListChangeListener.Change所示,将有效处理也可以设置操作。

        结果
        wasAdded() && wasRemoved()相同
        异常
        IllegalStateException - 如果此更改处于初始状态
      • wasUpdated

        public boolean wasUpdated​()
        表示getFrom()(包括)到getTo()的独占元素已更改。 这是唯一的可选事件类型,可能不会被所有ObservableLists触发。
        结果
        如果当前更改是更新更改,则为true。
        从以下版本开始:
        JavaFX 2.1
      • getAddedSubList

        public List<E> getAddedSubList​()
        要获取仅包含元素的列表的子列表视图,请使用getAddedSubList()方法。 这实际上是一个c.getList().subList(c.getFrom(), c.getTo());的快捷方式
           for (Node n : change.getAddedSubList()) { // do something }  
        结果
        新创建的包含所有添加元素的子列表视图。
        异常
        IllegalStateException - 如果此更改处于初始状态
      • getRemovedSize

        public int getRemovedSize​()
        getRemoved()列表的大小。
        结果
        删除的项目的数量
        异常
        IllegalStateException - 如果此更改处于初始状态
      • getAddedSize

        public int getAddedSize​()
        添加的间隔的大小
        结果
        添加项目的数量
        异常
        IllegalStateException - 如果此更改处于初始状态
      • getPermutation

        protected abstract int[] getPermutation​()
        如果这个改变是一个排列,它返回一个描述排列的整数数组。 这个数组直接从以前的索引映射到新的索引。 此方法不可公开访问,因此可以安全地返回数组。 数组的0索引对应于列表的索引getFrom() 最后一个索引和getTo()也是一样 该方法由wasPermutated()getPermutation(int)方法使用。
        结果
        如果这不是置换的空数组或包含置换的整数数组
        异常
        IllegalStateException - 如果此更改处于初始状态
      • getPermutation

        public int getPermutation​(int i)
        通过调用这些方法,可以观察发生的排列。 为了获得元素的新位置,您必须调用:
          change.getPermutation(oldIndex); 
        注意:此方法的默认实现采用getPermutation()方法的信息。 您不必重写此方法。
        参数
        i - 包含此更改之前的元素的旧索引
        结果
        新索引的元素相同
        异常
        IndexOutOfBoundsException - 如果我超出了列表的边界
        IllegalStateException - 如果这不是排列变化