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

クラスSizeSequence

java.lang.Object
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