モジュール java.desktop
パッケージ javax.swing

クラスSizeSequence


  • public class SizeSequence
    extends Object
    SizeSequenceオブジェクトは、サイズおよび対応する位置の、順序付けされたリストを効率的に維持します。 SizeSequenceの状況として適切な例としては、サイズが等しくない複数の行を表示するコンポーネントの場合があります。 この場合、単一のSizeSequenceオブジェクトを使って、すべての行の高さとY位置を追跡できます。

    もう1つの例として、列サイズが等しくないJTableなどの複数列コンポーネントがあります。 JTableは、単一のSizeSequenceオブジェクトを使ってすべての列の幅とX位置を格納できます。 続いてJTableは、SizeSequenceオブジェクトを使って特定の位置に対応する列を見つけることができます。 1つまたは複数の列サイズが変更になったときにはいつでも、JTableSizeSequenceオブジェクトを更新できます。

    次の図は、複数列コンポーネントのサイズと位置データの関係を示しています。

    最初の項目は位置0から始まり、2番目の項目は前の項目のサイズと同じ位置から始まり、そのあとも同様になる。

    この図で、最初のインデックス(0)は最初の列に対応し、2番目のインデックス(1)は2番目の列に対応する、というようになっています。 最初の列の位置は0で始まり、この列はsize0ピクセルを占めます。size0getSize(0)が返す値です。 したがって最初の列はsize0 - 1で終わります。 続いて2番目の列がsize0から始まり、size1(getSize(1)) ピクセルを占めます。

    SizeSequenceオブジェクトは単に軸に沿った間隔を表します。 上記の例では、間隔はピクセル単位の高さまたは幅を表しています。 しかし、一日のうちの時間など、ほかの測定単位も同じように有効です。

    実装ノート

    通常、エントリのサイズと位置を格納する際には、サイズの格納か、または位置の格納のどちらかを選びます。 描画中に必要な共通操作は、getIndex(position)およびsetSize(index, size)の2つです。 内部形式にどちらを選んでも、エントリ数が大きくなると2つの操作のどちらかは効率が悪くなります。 サイズを格納した場合、特定の位置を囲むエントリのインデックスの検索は、エントリ数に比例して時間がかかります。 逆に位置を格納した場合、特定のインデックスにあるエントリのサイズの設定は、影響を受けるエントリの位置を更新する必要があり、やはりエントリ数に比例して計算に時間がかかります。

    前述の方法と同じく、このクラスは内部にN個の整数の配列を保持しますが、サイズベースの方法と位置ベースの方法の中間の、ハイブリッドなエンコーディングを使用します。 これによって、情報を格納するのに必要な空間は同じですが、ほとんどの操作をO(N)時間ではなくLog(N)時間で実行できるデータ構造となります。Nはリストにあるエントリ数です。

    エントリ数のO(N)のまま残る操作は、insertEntriesメソッドとremoveEntriesメソッドの2つです。両メソッドとも、内部配列を整数サイズのセットに変換し、それを新しい配列にコピーし、そのあとハイブリッド表現を適切に修正することによって実装します。

    導入されたバージョン:
    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オブジェクトをリセットします。
    • コンストラクタの詳細

      • SizeSequence

        public SizeSequence()
        エントリを含まない新しいSizeSequenceオブジェクトを生成します。 エントリを登録するには、insertEntriesまたはsetSizesを使います。
        関連項目:
        insertEntries(int, int, int), setSizes(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)を返します。

        indexlengthより大きい場合、返される値は無意味です。

        パラメータ:
        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 - 削除されるエントリの数