レイアウト

これまでに、親ウィジェットのサイズに基づいて子ウィジェットのサイズまたは位置を設定する簡単な例について説明しました。 そこでは、このタイプの計算はサイズ変更リスナーに応答して発生しました。 通常は、この方法によって単純なウィジェットの位置決めを最適に行うことができます。 ただし、ウィジェットを配置する場合は、アプリケーションで共通のパターンが使用されます。 これらのパターンを構成可能なレイアウト・アルゴリズムとして構造化することにより、 多くの異なるアプリケーションで再使用することができます。

SWT はレイアウトを定義して、コンポジット内の子ウィジェットの位置決めおよびサイズ変更を汎用的に行います。 レイアウトは抽象クラス Layout のサブクラスです。 SWT の標準レイアウトは org.eclipse.swt.layout パッケージ内にあります。

ウィジェットのレイアウトの概念

ウィジェットのサイズ変更および位置決めを行う場合、一般的な定義をいくつか理解する必要があります。

これらの概念は、レイアウトを使用するかどうかどうかにかかわらず、アプリケーションに関係します。 レイアウトは、サイズ変更機能を再使用できるようにパッケージする便利な方法と見なすことができます。

レイアウトによって、さらに概念が導入されます。

これらの概念の詳細およびピクチャーについては、 「SWT のレイアウトの概要」を参照してください。 

次のコードの断片は、ラベルを親シェルと同じサイズにするためにサイズ変更コールバックを使用する アプリケーションの例を示しています。

Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
shell.addControlListener(new ControlAdapter() {
    public void controlResized(ControlEvent e) {
        label.setBounds (shell.getClientArea ());
    }
});

次のコードの断片は、レイアウトを使用して同じ効果を実現します。

Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
shell.setLayout(new FillLayout());

この例だけを見ても、レイアウトによってアプリケーションのコードが削減されることがわかります。 より複雑なレイアウトを使用する場合は、さらにコードが単純化されます。

SWT は、多くの状況に使用できる 3 つのデフォルトのレイアウト・クラスを提供します。

FillLayout

FillLayout は最も単純なレイアウト・クラスです。 ウィジェットを単一行または単一カラムにレイアウトして、それらを同じサイズにそろえます。 最初、ウィジェットは最も高いウィジェットと同じ高さ、最も幅が広いウィジェットと同じ幅になります。 FillLayout はラップを行わず、マージンまたはスペーシングは指定できません。

FillLayout を使用して、タスクバーまたはツールバーにボタンをレイアウトしたり、 Group 内に チェック・ボックスをスタックすることができます。   FillLayout は、 Composite 内に子のみが含まれる場合に 使用することもできます。 上記の例では、 FillLayout を使用することによって、ラベルはその親シェルを完全に埋め込みます。

RowLayout

RowLayout ではウィジェットを複数行にレイアウトしたり、 FillLayout よりも柔軟なレイアウトを行うことができます。 ウィジェットはラップされ、ウィジェットの表示に必要な数の行が作成されます。 また、レイアウトの各エッジに構成可能なマージンや、 レイアウトのウィジェット間に構成可能なスペーシングを設定することもできます。 RowLayout をパックして、すべてのウィジェットを同じサイズにすることができます。 RowLayout を位置調整すると、 Composite 内に残っている余分なスペースが ウィジェット間のマージンとして割り振られます。

RowLayout の各ウィジェットの高さおよび幅は、setLayoutData を使用してウィジェット内で設定する RowData オブジェクトで指定することがきます。

GridLayout

GridLayout は最も強力な (最も複雑な) レイアウトです。 GridLayout を使用すると、ウィジェットはグリッド内にレイアウトされ、 コンポジットのサイズを変更するときにグリッドの行およびカラムの振る舞いをコントロールする 多くの構成可能パラメーターが使用できるようになります。

GridLayout は、レイアウトの全体的な戦略をコントロールする API を定義します。 最も重要な属性は、グリッドの水平方向のサイズを決定する numColumns です。 通常、この値は、ウィンドウの外観を最初に設計するときに決定します。 グリッド内のウィジェットの順序は、作成順序と同じです。 グリッド内のウィジェットの順序を変更するには、 Control メソッドの moveAbove(Control) および moveBelow(Control) を使用します。 これらのメソッドを使用すると、レイアウト内でウィジェットを他のウィジェットの直前または直後に挿入することができます。 ("上方" および "下方" は、グリッド自体におけるロケーションでなく、ウィジェットの Z 方向の順序を表します)。

次の表に、 GridLayout の構成可能パラメーターの要約を示します。

属性

説明

horizontalSpacing

特定のセルの右端とその隣接セルの左端の間のピクセル数です。

makeColumnsEqualWidth

すべてのカラムを強制的に同じ幅にするかどうかを指定します。

marginWidth

グリッドの右端および左端のマージンに使用されるピクセル数です。

marginHeight

グリッドの上端および下端のマージンに使用されるピクセル数です。

numColumns

グリッドを作成するために使用されるカラム数です。

verticalSpacing

特定のセルの下端とその隣接セルの上端の間のピクセル数です。

GridLayout は、他にも、グリッド内の各ウィジェットに使用できる多数のレイアウト・パラメーターをサポートします。 これらのプロパティーは GridData オブジェクト内で指定されます。 グリッド内の各ウィジェットの layoutData として、 GridData を設定する必要があります。

GridData クラスが定義するスタイル定数を使用することにより、 GridData コンストラクター内で一般に使用されるレイアウト・パラメーターの組み合わせを指定することができます。 GridData の public メソッドを使用して、 これらの属性を個別に設定することもできます。

GridData を使用して、 より動的で複雑なレイアウトを行うことができます。グリッド内の各ウィジェットに対してこれらの値を微調整することにより、 レイアウトをさまざまに組み合わせることができます。 最も複雑なダイアログのレイアウトも、 GridData を使用して指定することができます。 ウィジェットを複数のセルにスパンできる機能を使用すると、 グリッドと外観が異なるさまざまなレイアウトを作成することができます。

次の表に、GridData の 構成可能パラメーターの要約を示します。    さまざまなグリッド・パラメーターを使用する画面捕そくの詳細および例については、 「SWT のレイアウトの概要」を参照してください。

属性

説明

grabExcessHorizontalSpace

グリッド内で使用可能な水平方向の余分なスペースを使用するためにセルを拡大するかどうかを指定します。 ウィジェットおよびグリッド・データに基づいてグリッド内のセル・サイズを計算した後に、 コンポジットに残っている余分なスペースを、超過スペースを受け入れるセルに割り振ります。

grabExcessVerticalSpace

グリッド内で使用可能な垂直方向の余分なスペースを使用するためにセルを拡大するかどうかを指定します。

heightHint

ウィジェットの最小の高さ (つまり、ウィジェットを格納する行の最小の高さ) を指定します。

horizontalAlignment

BEGINNINGCENTERENDFILL のいずれかをとります。FILL を指定すると、 ウィジェットがそのグリッド・セルの幅全体を占めるようにサイズが設定されます。

horizontalIndent

ウィジェットとグリッド・セルの左端の間のピクセル数です。

horizontalSpan

ウィジェットが占めるグリッドのカラム数を指定します。 デフォルトでは、ウィジェットはグリッド内のセルを 1 つ占めます。 この値を大きくして、ウィジェットが占める水平方向のセルの数を増やすことができます。

verticalAlignment

BEGINNINGCENTERENDFILL のいずれかをとります。FILL を指定すると、 ウィジェットがそのグリッド・セルの高さ全体を占めるようにサイズが設定されます。

verticalSpan

ウィジェットが占めるグリッドの行数を指定します。デフォルトでは、ウィジェットはグリッド内のセルを 1 つ占めます。 この値を大きくして、ウィジェットが占める垂直方向のセルを増やすことができます。

widthHint

ウィジェットの最小の幅 (つまり、ウィジェットを格納するカラムの最小の幅) を指定します。

カスタム・レイアウト

場合によっては、独自のカスタム Layout クラスを 記述する必要があります。カスタム・レイアウトは、アプリケーションのさまざまな状況で使用される 複雑なレイアウトを持つ場合に最適です。 また、アプリケーション固有の情報を使用してレイアウトを最適化するときに役立つ場合があります。 カスタム・レイアウトを作成する前に、次の点を検討してください。

複数の Composite ウィジェットで使用される きわめて汎用的なレイアウトを記述する場合を除き、サイズ変更リスナーの子のサイズおよび位置を計算する方が、通常はより単純で簡単です。 SWT カスタム・ウィジェットの多くは、この方法で記述されています。 新しいウィジェットは Composite/Layout のペアとしてインプリメントできますが、 サイズ変更リスナー内でレイアウトを実行して、 computeSize の推奨サイズを計算する Composite としてインプリメントする方がより明確で、 余分なクラスを記述する必要がありません。

それでもカスタム・レイアウト・クラスが必要な場合は、 サイズ変更リスナーにレイアウト・アルゴリズムを最初にインプリメントすることをお勧めします。 これにより、アルゴリズム自体のデバッグが単純になります。 サイズの縮小または拡大、ラッピング、クリッピングなど、レイアウトに関するさまざまなケースのテストを行ってください。  アルゴリズムが機能することを確認した後、 Layout のサブクラスに コードを再度組み込むことができます。 

レイアウトには、次の 2 つのメソッドをインプリメントする役割があります。

カスタム・レイアウトの詳細については、 「SWT のレイアウトの概要」を参照してください。