javax.swing

接口
异常
java.lang.Object
  继承者 javax.swing.SizeSequence

public class SizeSequence
     
extends Object

一个 SizeSequence 对象,它有效地维护一个包含大小和相应位置的顺序列表。有一种情况需要用到 SizeSequence,即显示具有不同大小的多个行的组件。在这种情况下,用一个单独的 SizeSequence 对象可跟踪所有行的高度和 Y 位置。

另一个例子是包含多列的组件,比如 JTable,它的各列大小不尽相同。JTable 可使用一个单独的 SizeSequence 对象来存储所有列的宽度和 X 位置。然后,JTable 可以使用 SizeSequence 对象来查找与特定位置对应的列。只要有一列或多列大小发生更改,JTable 就会更新该 SizeSequence 对象。

下图显示了多列组件中大小和位置数据之间的关系。

第一项起始位置为 0,第二项起始位置等于
前一项的大小,依此类推。

在上图中,第一个索引 (0) 对应第一列,第二个索引 (1) 对应第二列,依此类推。第一列位置从 0 开始,该列占据 size0 个像素,其中 size0getSize(0) 返回的值。因此,第一列在 size0 - 1 位置结束。然后第二列从 size0 位置开始并占据 size1 (getSize(1)) 个像素。

注意,SizeSequence 对象只代表轴上的间隔。在我们的示例中,间隔代表以像素为单位的高度或宽度。但是,任何其他测量单位(例如,时间单位为天)也同样有效。

实现注意事项

通常,存储条目的大小和位置时,我们会选择是存储条目的大小还是位置。呈现时需要两个公共操作: getIndex(position)setSize(index, size)。无论选择哪种内部格式,当条目数变大时,这两个操作中每一个开销都很大。如果存储的是大小,查找位于特定位置的条目索引与条目数呈线性关系。反过来,如果存储的是位置,对位于特定索引的条目设置大小需要更新相关条目的位置,这又是一个线性计算。

与以上技巧相似,此类内部保存一个包含 N 个整数的数组,但它使用混合编码,这是介于基于大小和基于位置的方法之间一种折中方法。结果为一个数据结构,它存储信息需要相同大小的空间,但是执行大多数操作只需要 Log(N) 次,而不是 O(N) 次,N 是列表中的条目数。

有两个操作还需要执行 O(N) 条目数次,它们就是 insertEntriesremoveEntries 方法,两者的实现方法都是将内部数组转换为一组整数大小,将它复制到新数组,然后将混合表示形式重新正确归位。

从以下版本开始:
1.3

构造方法摘要
SizeSequence()
          创建一个新的 SizeSequence 对象,它不包含任何条目。
SizeSequence(int numEntries)
          创建一个新的 SizeSequence 对象,它包含指定的条目数,每个大小都已初始化为 0。
SizeSequence(int[] sizes)
          创建一个新的 SizeSequence 对象,它包含指定的大小。
SizeSequence(int numEntries, int value)
          创建一个新的 SizeSequence 对象,它包含指定的条目数,每个大小都已初始化为 value
 
方法摘要
 int 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 对象。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

SizeSequence

public SizeSequence()
创建一个新的 SizeSequence 对象,它不包含任何条目。要添加条目,可使用 insertEntriessetSizes

另请参见:
insertEntries(int, int, int), setSizes(int, int)

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 中的大小的数组
方法详细信息

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)
返回与指定位置对应的条目的索引。例如,由于第一个条目通常从位置 0 开始, getIndex(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 中。注意, startlength 的值必须满足如下条件: (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 中移除一组相邻的条目。注意, startlength 的值必须满足如下条件: (0 <= start < getSizes().length) AND (length >= 0)。如果未满足这些条件,则行为未指定并且可能抛出异常。

参数:
start - 要移除的第一个条目的索引
length - 要移除的条目数