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

クラスGroupLayout

java.lang.Object
javax.swing.GroupLayout
すべての実装されたインタフェース:
LayoutManager, LayoutManager2

public class GroupLayout extends Object implements LayoutManager2
GroupLayoutは、Container内に配置するためにコンポーネントを階層的にグループ化するLayoutManagerです。 GroupLayoutはビルダー用ですが、ハンドコーディングすることもできます。 グループ化は、Groupクラスのインスタンスによって行われます。 GroupLayoutは、2種類のグループをサポートします。 順次グループは、子要素を1つずつ順番に配置します。 並列グループは、子要素を4とおりの方法で配置します。

各グループに任意の数の要素(GroupComponent、またはギャップ)を含めることができます。 ギャップは、最小サイズ、適切なサイズ、および最大サイズを持つ不可視コンポーネントと見なすことができます。 GroupLayoutは適切なギャップもサポートし、その値はLayoutStyleから得られます。

要素はバネに似ています。 各要素には、最小、適切、および最大で指定された範囲があります。 ギャップの範囲は、開発者が指定するか、 LayoutStyleによって決定されます。 Componentの範囲は、ComponentgetMinimumSizeメソッド、 getPreferredSizeメソッド、およびgetMaximumSizeメソッドによって決定されます。 また、Componentを追加するときに、そのコンポーネントの範囲ではなく、特定の範囲を指定して使用することもできます。 Groupの範囲は、グループのタイプによって決定されます。 ParallelGroupの範囲は、その要素の範囲の最大値です。 SequentialGroupの範囲は、その要素の範囲の合計値です。

GroupLayoutは、各軸を別々に扱います。 つまり、水平軸を表すグループと垂直軸を表すグループが存在します。 水平グループは、水平軸に沿った最小サイズ、推奨サイズおよび最大サイズを決定し、グループ内のコンポーネントのxの値と幅を設定します。 垂直グループは、垂直軸に沿った最小サイズ、推奨サイズおよび最大サイズを決定し、グループ内のコンポーネントのyの値と高さを設定します。 Componentは、水平グループと垂直グループの両方に存在する必要があります。そうでない場合は、配置中あるいは最小サイズ、推奨サイズまたは最大サイズが要求されたときにIllegalStateExceptionがスローされます。

次の図に、水平軸に沿った順次グループを示します。 順次グループには3つのコンポーネントが含まれています。 並列グループは、垂直軸に沿って使用されました。

3つのコンポーネントの水平軸に沿った順次グループ

各軸を別々に扱うため、図には各グループの範囲と各軸に沿った要素が表示されています。 各コンポーネントの範囲は軸上に投影されており、グループは青(水平)と赤(垂直)で描画されています。 わかりやすいように、順次グループ内の各要素は間隔を空けて並べられています。

水平軸に沿った順次グループは、青い直線で描画されています。 順次グループは、グループ内の子要素の合計値になっている点に注意してください。

水平軸に沿った並列グループは、各コンポーネントの高さの最大値になっています。 3つのコンポーネントはすべて同じ高さなので、並列グループも同じ高さになります。

次の図に、3つの同じコンポーネントを示します。ただし、並列グループは水平軸、順次グループは垂直軸に沿っています。

3つのコンポーネントの垂直軸に沿った順次グループ

3つのコンポーネントのうちもっとも値が大きいのはc1なので、並列グループのサイズはc1と同じになります。 c2c3c1より小さいので、コンポーネントに配置方法が指定されていればその方法、指定されていない場合は並列グループのデフォルトの配置方法で配置されます。 図のc2c3は、LEADINGの配置方法で作成されました。 コンポーネントが右から左へ配置されている場合、c2c3は逆向きに配置されます。

次の図に、水平軸と垂直軸に沿った順次グループを示します。

3つのコンポーネントの水平軸と垂直軸の両方に沿った順次グループ

GroupLayoutは、Component間にギャップを挿入する機能を提供します。 ギャップのサイズは、LayoutStyleのインスタンスによって決定されます。 この機能は、setAutoCreateGapsメソッドを使って有効にすることができます。 同様に、setAutoCreateContainerGapsメソッドを使って、親コンテナの端とコンテナに接するコンポーネント間にギャップを挿入することもできます。

次のコードでは、ある列に2つのラベル、次の列に2つのテキスト・フィールドが続くパネルを構築します。

   JComponent panel = ...;
   GroupLayout layout = new GroupLayout(panel);
   panel.setLayout(layout);

   // Turn on automatically adding gaps between components
   layout.setAutoCreateGaps(true);

   // Turn on automatically creating gaps between components that touch
   // the edge of the container and the container.
   layout.setAutoCreateContainerGaps(true);

   // Create a sequential group for the horizontal axis.

   GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();

   // The sequential group in turn contains two parallel groups.
   // One parallel group contains the labels, the other the text fields.
   // Putting the labels in a parallel group along the horizontal axis
   // positions them at the same x location.
   //
   // Variable indentation is used to reinforce the level of grouping.
   hGroup.addGroup(layout.createParallelGroup().
            addComponent(label1).addComponent(label2));
   hGroup.addGroup(layout.createParallelGroup().
            addComponent(tf1).addComponent(tf2));
   layout.setHorizontalGroup(hGroup);

   // Create a sequential group for the vertical axis.
   GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();

   // The sequential group contains two parallel groups that align
   // the contents along the baseline. The first parallel group contains
   // the first label and text field, and the second parallel group contains
   // the second label and text field. By using a sequential group
   // the labels and text fields are positioned vertically after one another.
   vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
            addComponent(label1).addComponent(tf1));
   vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
            addComponent(label2).addComponent(tf2));
   layout.setVerticalGroup(vGroup);
 

実行すると、次のものが生成されます。

生成された水平/垂直フォーム

この配置は、次のもので構成されます。

  • 2つの並列グループを含む順次グループで構成される水平軸。 1つめの並列グループにはラベル、2つめの並列グループにはテキスト・フィールドが含まれます。
  • 2つの並列グループを含む順次グループで構成される垂直軸。 並列グループのコンポーネントは、ベースラインに沿って並べられるように構成されています。 1つめの並列グループには1つめのラベルとテキスト・フィールド、2つめの並列グループには2つめのラベルとテキスト・フィールドが含まれます。
このコードには、注意すべき点がいくつかあります。
  • コンテナにコンポーネントを明示的に追加する必要はありません。これは、Groupaddメソッドのいずれかを使用して間接的に行われます。
  • さまざまなaddメソッドが呼出し側を返します。 これにより、簡単にメソッド呼出しを連鎖させることができます。 たとえば、group.addComponent(label1).addComponent(label2);group.addComponent(label1); group.addComponent(label2);と同等です。
  • Groupには、publicコンストラクタがありません。代わりに、GroupLayoutのcreateメソッドを使用してください。

導入されたバージョン:
1.6