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
ConstructorDescription创建一个不包含任何条目的新SizeSequence
对象。SizeSequence
(int numEntries) 创建一个包含指定数量条目的新SizeSequence
对象,所有条目的大小都初始化为0。SizeSequence
(int[] sizes) 创建一个包含指定大小的新SizeSequence
对象。SizeSequence
(int numEntries, int value) 创建一个包含指定数量条目的新SizeSequence
对象,所有条目的大小都初始化为value
。 -
Method Summary
Modifier and TypeMethodDescriptionint
getIndex
(int position) 返回与指定位置对应的条目的索引。int
getPosition
(int index) 返回指定条目的起始位置。int
getSize
(int index) 返回指定条目的大小。int[]
getSizes()
返回所有条目的大小。void
insertEntries
(int start, int length, int value) 向这个SizeSequence
添加一组连续的条目。void
removeEntries
(int start, int length) 从这个SizeSequence
中移除一组连续的条目。void
setSize
(int index, int size) 设置指定条目的大小。void
setSizes
(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
- 要移除的条目数量
-