java.lang.Object
javax.swing.SizeSequence
一个
SizeSequence对象有效地维护了一个尺寸和相应位置的有序列表。一个适合使用SizeSequence的情况是在显示多行不等高的组件中。在这种情况下,可以使用单个SizeSequence对象来跟踪所有行的高度和Y位置。
另一个例子是多列组件,比如一个JTable,其中列的大小不都相等。JTable可以使用单个SizeSequence对象来存储所有列的宽度和X位置。然后JTable可以使用SizeSequence对象来找到对应于特定位置的列。当一个或多个列的大小发生变化时,JTable可以更新SizeSequence对象。
下图显示了多列组件的尺寸和位置数据之间的关系。

在图中,第一个索引(0)对应于第一列,第二个索引(1)对应于第二列,依此类推。第一列的位置从0开始,列占据size0像素,其中size0是getSize(0)返回的值。因此,第一列结束于size0 - 1。然后第二列从位置size0开始,占据size1(getSize(1))像素。
请注意,SizeSequence对象只是表示沿轴的间隔。在我们的示例中,这些间隔表示像素的高度或宽度。然而,任何其他度量单位(例如,以天为单位的时间)同样有效。
实现注意事项
通常在存储条目的大小和位置时,可以选择存储大小或存储它们的位置之间进行选择。在渲染期间需要的两个常见操作是:getIndex(position)和setSize(index, size)。无论选择哪种内部格式,其中一个操作在条目数量变大时都是昂贵的。如果存储大小,找到包围特定位置的条目的索引是与条目数量成线性关系的。如果存储位置,设置特定索引处的条目大小需要更新受影响条目的位置,这也是一个线性计算。
与上述技术类似,这个类在内部保持一个N个整数的数组,但使用了一种混合编码,介于基于大小和基于位置的方法之间。结果是一个数据结构,用于存储信息需要相同的空间,但可以在Log(N)时间内执行大多数操作,而不是O(N),其中N是列表中的条目数。
在条目数量方面仍然是O(N)的两个操作是insertEntries和removeEntries方法,这两个方法通过将内部数组转换为一组整数大小,将其复制到新数组中,然后在原地重新形成混合表示来实现。
- 自版本:
- 1.3
-
Constructor Summary
ConstructorsConstructorDescription创建一个不包含任何条目的新SizeSequence对象。SizeSequence(int numEntries) 创建一个包含指定数量条目的新SizeSequence对象,所有条目的大小都初始化为0。SizeSequence(int[] sizes) 创建一个包含指定大小的新SizeSequence对象。SizeSequence(int numEntries, int value) 创建一个包含指定数量条目的新SizeSequence对象,所有条目的大小都初始化为value。 -
Method Summary
Modifier and TypeMethodDescriptionintgetIndex(int position) 返回与指定位置对应的条目的索引。intgetPosition(int index) 返回指定条目的起始位置。intgetSize(int index) 返回指定条目的大小。int[]getSizes()返回所有条目的大小。voidinsertEntries(int start, int length, int value) 向这个SizeSequence添加一组连续的条目。voidremoveEntries(int start, int length) 从这个SizeSequence中移除一组连续的条目。voidsetSize(int index, int size) 设置指定条目的大小。voidsetSizes(int[] sizes) 使用sizes参数中的数据重置这个SizeSequence对象。
-
Constructor Details
-
SizeSequence
public SizeSequence()创建一个不包含任何条目的新SizeSequence对象。要添加条目,可以使用insertEntries或setSizes。- 参见:
-
SizeSequence
public SizeSequence(int numEntries) 创建一个包含指定数量条目的新SizeSequence对象,所有条目的大小都初始化为0。- 参数:
-
numEntries- 要跟踪的尺寸数量 - 抛出:
-
NegativeArraySizeException- 如果numEntries < 0
-
SizeSequence
public SizeSequence(int numEntries, int value) 创建一个包含指定数量条目的新SizeSequence对象,所有条目的大小都初始化为value。- 参数:
-
numEntries- 要跟踪的尺寸数量 -
value- 每个尺寸的初始值
-
SizeSequence
public SizeSequence(int[] sizes) 创建一个包含指定大小的新SizeSequence对象。- 参数:
-
sizes- 要包含在SizeSequence中的尺寸数组
-
-
Method Details
-
setSizes
public void setSizes(int[] sizes) 使用sizes参数中的数据重置这个SizeSequence对象。该方法重新初始化此对象,使其包含与sizes数组中的条目数量相同的条目。每个条目的大小初始化为sizes中相应项目的值。- 参数:
-
sizes- 要包含在这个SizeSequence中的尺寸数组
-
getSizes
public int[] getSizes()返回所有条目的大小。- 返回:
- 包含此对象中尺寸的新数组
-
getPosition
public int getPosition(int index) 返回指定条目的起始位置。例如,getPosition(0)返回0,getPosition(1)等于getSize(0),getPosition(2)等于getSize(0)+getSize(1),依此类推。请注意,如果
index大于length,则返回的值可能没有意义。- 参数:
-
index- 欲获取其位置的条目的索引 - 返回:
- 指定条目的起始位置
-
getIndex
public int getIndex(int position) 返回与指定位置对应的条目的索引。例如,getIndex(0)为0,因为第一个条目始终从位置0开始。- 参数:
-
position- 条目的位置 - 返回:
- 占据指定位置的条目的索引
-
getSize
public int getSize(int index) 返回指定条目的大小。如果index超出范围(0 <= index < getSizes().length),行为是未指定的。- 参数:
-
index- 对应于条目的索引 - 返回:
- 条目的大小
-
setSize
public void setSize(int index, int size) 设置指定条目的大小。请注意,如果index的值不在范围内:(0 <= index < getSizes().length),行为是未指定的。- 参数:
-
index- 对应于条目的索引 -
size- 条目的大小
-
insertEntries
public void insertEntries(int start, int length, int value) 向这个SizeSequence添加一组连续的条目。请注意,start和length的值必须满足以下条件:(0 <= start < getSizes().length) AND (length >= 0)。如果不满足这些条件,行为是未指定的,可能会抛出异常。- 参数:
-
start- 分配给组中第一个条目的索引 -
length- 组中的条目数量 -
value- 分配给每个新条目的大小 - 抛出:
-
ArrayIndexOutOfBoundsException- 如果参数超出范围:(0 <= start < (getSizes().length)) AND (length >= 0)
-
removeEntries
public void removeEntries(int start, int length) 从这个SizeSequence中移除一组连续的条目。请注意,start和length的值必须满足以下条件:(0 <= start < getSizes().length) AND (length >= 0)。如果不满足这些条件,行为是未指定的,可能会抛出异常。- 参数:
-
start- 要移除的第一个条目的索引 -
length- 要移除的条目数量
-