- java.lang.Object
-
- javafx.collections.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
-
-
构造方法摘要
构造方法 Constructor 描述 Change(ObservableList<E> list)
构造一个新的列表更改。
-
方法摘要
所有方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 int
getAddedSize()
添加的间隔的大小List<E>
getAddedSubList()
要获取仅包含元素的列表的子列表视图,请使用getAddedSubList()方法。abstract int
getFrom()
如果wasAdded为true,则间隔包含所有添加的值。ObservableList<E>
getList()
源列表的更改。protected abstract int[]
getPermutation()
如果这个改变是一个排列,它返回一个描述排列的整数数组。int
getPermutation(int i)
通过调用这些方法,可以观察发生的排列。abstract List<E>
getRemoved()
已删除/替换元素的不可变列表。int
getRemovedSize()
getRemoved()列表的大小。abstract int
getTo()
更改间隔的结束。abstract boolean
next()
转到下一个变化。abstract void
reset()
重置到初始阶段。boolean
wasAdded()
指示在此更改期间是否添加元素boolean
wasPermutated()
指示更改是否只是一个排列。boolean
wasRemoved()
表示在此更改期间元素是否被删除。boolean
wasReplaced()
表示在此更改期间是否更换了元素。boolean
wasUpdated()
表示getFrom()(包括)到getTo()的独占元素已更改。
-
-
-
构造方法详细信息
-
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()
- 结果
- 如果从列表中删除某些内容,则为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
- 如果这不是排列变化
-
-