Module java.desktop
Package javax.swing

Class SizeSequence

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开始,占据size1getSize(1))像素。

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

实现注意事项

通常在存储条目的大小和位置时,可以选择存储大小或存储它们的位置之间进行选择。在渲染期间需要的两个常见操作是:getIndex(position)setSize(index, size)。无论选择哪种内部格式,其中一个操作在条目数量变大时都是昂贵的。如果存储大小,找到包围特定位置的条目的索引是与条目数量成线性关系的。如果存储位置,设置特定索引处的条目大小需要更新受影响条目的位置,这也是一个线性计算。

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

在条目数量方面仍然是O(N)的两个操作是insertEntriesremoveEntries方法,这两个方法通过将内部数组转换为一组整数大小,将其复制到新数组中,然后在原地重新形成混合表示来实现。

自版本:
1.3
  • Constructor Summary

    Constructors
    Constructor
    Description
    创建一个不包含任何条目的新SizeSequence对象。
    SizeSequence(int numEntries)
    创建一个包含指定数量条目的新SizeSequence对象,所有条目的大小都初始化为0。
    SizeSequence(int[] sizes)
    创建一个包含指定大小的新SizeSequence对象。
    SizeSequence(int numEntries, int value)
    创建一个包含指定数量条目的新SizeSequence对象,所有条目的大小都初始化为value
  • Method Summary

    Modifier and Type
    Method
    Description
    int
    getIndex(int position)
    返回与指定位置对应的条目的索引。
    int
    getPosition(int index)
    返回指定条目的起始位置。
    int
    getSize(int index)
    返回指定条目的大小。
    int[]
    返回所有条目的大小。
    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对象。

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • SizeSequence

      public SizeSequence()
      创建一个不包含任何条目的新SizeSequence对象。要添加条目,可以使用insertEntriessetSizes
      参见:
    • 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添加一组连续的条目。请注意,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 - 要移除的条目数量