モジュール java.desktop
パッケージ java.awt

クラスGridBagLayout

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

public class GridBagLayout extends Object implements LayoutManager2, Serializable
GridBagLayoutクラスは、コンポーネントが同じサイズであることを要求することなく、コンポーネントを垂直方向に、水平方向に、またはベースラインに沿って配置する柔軟なレイアウト・マネージャです。 それぞれのGridBagLayoutオブジェクトは、セルによって構成される動的な矩形グリッドを格納しています。各コンポーネントは、1つ以上のセル(表示領域と呼ぶ)に配置されます。

GridBagLayoutによって管理される各コンポーネントは、GridBagConstraintsのインスタンスと関連します。 制約オブジェクトは、コンポーネントの表示領域をグリッド上に配置する場所、およびコンポーネントをその表示領域内に配置する方法を指定します。 また、この制約オブジェクトに加え、GridBagLayoutは、コンポーネントのサイズを決定するために、各コンポーネントの最小サイズおよび推奨サイズを考慮します。

グリッドの全体の方向は、コンテナのComponentOrientationプロパティによって決まります。 水平方向に左から右の場合、グリッドの座標(0, 0)はコンテナの左上隅になります。この場合、X座標は右方向に、Y座標は下方向に値が増加します。 水平方向に右から左の場合、グリッドの座標(0, 0)はコンテナの右上隅になります。この場合、X座標は左方向に、Y座標は下方向に値が増加します。

グリッド・バッグ・レイアウトを効果的に利用するには、コンポーネントの少なくとも1つのGridBagConstraintsオブジェクトをカスタマイズする必要があります。 GridBagConstraintsオブジェクトをカスタマイズするには、1つまたは複数のインスタンス変数を設定します。

GridBagConstraints.gridx, GridBagConstraints.gridy
コンポーネントの表示領域のリーディング・コーナーを格納するセルを指定します。グリッドの原点にあるセルのアドレスはgridx = 0gridy = 0です。 水平方向に左から右へのレイアウトの場合、コンポーネントのリーディング・コーナーは左上隅です。 水平方向に右から左へのレイアウトの場合、コンポーネントのリーディング・コーナーは右上隅です。 GridBagConstraints.RELATIVE (デフォルト値)を使用して、コンポーネントを、このコンポーネントが追加される直前にコンテナに追加されたコンポーネントの直後に(gridxはx軸に沿って、gridyはy軸に沿って)配置するよう指定します。
GridBagConstraints.gridwidth, GridBagConstraints.gridheight
コンポーネントの表示領域における1行(gridwidth)または1列(gridheight)あたりのセルの数を指定します。 デフォルト値は1です。 コンポーネントの表示領域がgridxから行の最後のセルまで(gridwidth)またはgridyから列の最後のセルまで(gridheight)であることを指定する場合は、GridBagConstraints.REMAINDERを使用します。 コンポーネントの表示領域がgridxから、行の最後から2番目のセルまで(gridwidth))、またはgridyから、列の最後から2番目のセルまで(gridheight)であることを指定する場合は、GridBagConstraints.RELATIVEを使用します。
GridBagConstraints.fill
コンポーネントの表示領域が、必要とするサイズよりも大きい場合には、コンポーネントのサイズ変更を行うかどうかと変更の方法を決定するために使用されます。 指定できる値は、GridBagConstraints.NONE (デフォルト)、GridBagConstraints.HORIZONTAL (コンポーネントの高さは変更せずに、幅を表示領域最大にする)、GridBagConstraints.VERTICAL (コンポーネントの幅は変更せずに、高さを表示領域最大にする)、GridBagConstraints.BOTH (コンポーネントを表示領域最大にする)です。
GridBagConstraints.ipadx, GridBagConstraints.ipady
レイアウト内のコンポーネントの内側のパディング(コンポーネントの最小サイズに追加する値)を指定します。 コンポーネントの幅は、少なくとも最小の幅+ipadxピクセルとなります。 同様に、コンポーネントの高さは、少なくとも最小の高さ+ipadyピクセルとなります。
GridBagConstraints.insets
コンポーネントの外側のパディング、つまりコンポーネントと表示領域の端との間の最小の空間を指定します。
GridBagConstraints.anchor
表示領域内のコンポーネントの位置を指定します。 可能な値は3種類あります: 絶対値、方向相対値およびベースライン相対値。 方向の相対値は、コンテナのComponentOrientationプロパティを基準として解釈されますが、絶対値は解釈されません。 ベースライン相対値は、ベースラインを基準にして計算されます。 有効な値は次のとおりです。
  • 絶対値:
    • GridBagConstraints.NORTH
    • GridBagConstraints.SOUTH
    • GridBagConstraints.WEST
    • GridBagConstraints.EAST
    • GridBagConstraints.NORTHWEST
    • GridBagConstraints.NORTHEAST
    • GridBagConstraints.SOUTHWEST
    • GridBagConstraints.SOUTHEAST
    • GridBagConstraints.CENTER (デフォルト)
  • 方向相対値:
    • GridBagConstraints.PAGE_START
    • GridBagConstraints.PAGE_END
    • GridBagConstraints.LINE_START
    • GridBagConstraints.LINE_END
    • GridBagConstraints.FIRST_LINE_START
    • GridBagConstraints.FIRST_LINE_END
    • GridBagConstraints.LAST_LINE_START
    • GridBagConstraints.LAST_LINE_END
  • ベースライン相対値:
    • GridBagConstraints.BASELINE
    • GridBagConstraints.BASELINE_LEADING
    • GridBagConstraints.BASELINE_TRAILING
    • GridBagConstraints.ABOVE_BASELINE
    • GridBagConstraints.ABOVE_BASELINE_LEADING
    • GridBagConstraints.ABOVE_BASELINE_TRAILING
    • GridBagConstraints.BELOW_BASELINE
    • GridBagConstraints.BELOW_BASELINE_LEADING
    • GridBagConstraints.BELOW_BASELINE_TRAILING
GridBagConstraints.weightx, GridBagConstraints.weighty
スペースの分配方法を決定するために使用されます。これは、サイズ変更の動作を指定するために重要です。 1行(weightx)または1列(weighty)につき、少なくとも1つのコンポーネントにウエイトを設定しないかぎり、すべてのコンポーネントがコンテナの中央に集まります。 これは、ウエイトが0の場合(デフォルト)には、GridBagLayoutオブジェクトが余分なスペースをすべてセルのグリッドとコンテナの端の間に配置してしまうからです。

各行にはベースラインがあります。ベースラインは、その行の有効なベースラインを持ち、ベースライン(コンポーネントのアンカー値は、 BASELINEBASELINE_LEADINGまたはBASELINE_TRAILINGのいずれかです)に沿って整列されたコンポーネントによって決まります。 行内でいずれのコンポーネントも有効なベースラインを持たない場合、その行にベースラインはありません。

複数の行にまたがるようなコンポーネントは、開始行のベースライン(ベースライン・サイズ変更動作が CONSTANT_ASCENTの場合)、または終了行のベースライン(ベースライン・サイズ変更動作がCONSTANT_DESCENTの場合)に沿って配置されます。 コンポーネントが沿う行は、支配行と呼ばれます。

次の図に、ベースラインのレイアウトを示します。この図では複数行にまたがるコンポーネントが存在します。

後述の本文でこのグラフィックを説明する(図1)

このレイアウトには3つのコンポーネントがあります。
  • 行0から始まり、行1で終わるパネル。 パネルにはベースライン・サイズ変更動作CONSTANT_DESCENTとアンカーBASELINEが設定されています。 ベースライン・サイズ変更動作がCONSTANT_DESCENTであるため、パネルの支配行は行1です。
  • 2つのボタン。それぞれベースライン・サイズ変更動作CENTER_OFFSETとアンカーBASELINEが設定されています。
2番目のボタンとパネルが同じ支配行を共有しているため、どちらも各自のベースラインに沿って配置されています。

ベースライン相対値のいずれかを使用して配置されたコンポーネントは、絶対値または方向相対値を使用して配置した場合と異なる方法でサイズが変更されます。 コンポーネントの変更方法は、支配行のベースラインの変更方法によって指示されます。 同じ支配行を持つ任意のコンポーネントでベースライン・サイズ変更動作CONSTANT_DESCENTが設定されている場合、ベースラインは表示領域の下端にアンカー設定されます。そうでない場合、ベースラインは表示領域の上端にアンカー設定されます。 次のルールによってサイズ変更動作が指示されます。

  • ベースラインより上に配置されたサイズ変更可能コンポーネントは、ベースラインと同じ高さまでしか高くすることはできません。 たとえばベースラインが100で、上端にアンカー設定されている場合、ベースラインより上に配置されたサイズ変更可能コンポーネントは100単位よりも高くすることはできません。
  • 同様に、ベースラインより下に配置されたサイズ変更可能コンポーネントは、表示高さとベースラインの間隔よりも高くすることはできません。
  • ベースラインに配置され、ベースライン・サイズ変更動作OTHERが設定されたサイズ変更可能コンポーネントの場合は、サイズ変更後のサイズのベースラインが表示領域に収まる場合に限り、サイズ変更されます。 ベースラインが表示領域内に収まらなくなる場合、コンポーネントはサイズ変更されません。
  • ベースライン・サイズ変更動作がOTHERではないベースラインに配置されたコンポーネントは、display height - baseline+baseline of componentまで高くすることができます。
ベースラインに沿ってコンポーネントを配置したが、そのコンポーネントに有効なベースラインがない場合は、コンポーネントの空間内で垂直方向に中央揃えされます。 同様に、ベースラインを基準にコンポーネントを配置したが、行内のどのコンポーネントも有効なベースラインを持たない場合、そのコンポーネントは垂直方向に中央揃えされます。

次に示す図は、グリッド・バッグ・レイアウトによって管理される10個のコンポーネント(すべてのボタン)を示します。 図2は水平方向に左から右へのコンテナを示し、図3は水平方向に右から左へのコンテナを示します。

前の文は、このグラフィック(図2)を説明しています。

図2: 水平方向に左から右

前述のテキストでは、この図(図3)について説明します。

図3: 水平方向に右から左


10個のコンポーネントのそれぞれは、その関連しているGridBagConstraintsオブジェクトのfillフィールドがGridBagConstraints.BOTHに設定されています。 さらにコンポーネントは、デフォルトとは異なる次の制約を持っています。

  • Button1、Button2、Button3: weightx = 1.0
  • Button4: weightx = 1.0, gridwidth = GridBagConstraints.REMAINDER
  • Button5: gridwidth = GridBagConstraints.REMAINDER
  • Button6: gridwidth = GridBagConstraints.RELATIVE
  • Button7: gridwidth = GridBagConstraints.REMAINDER
  • Button8: gridheight = 2, weighty = 1.0
  • Button9、Button 10: gridwidth = GridBagConstraints.REMAINDER

上記の例を実装したサンプル・コードを示します。


 import java.awt.*;
 import java.util.*;
 import java.applet.Applet;

 public class GridBagEx1 extends Applet {

     protected void makebutton(String name,
                               GridBagLayout gridbag,
                               GridBagConstraints c) {
         Button button = new Button(name);
         gridbag.setConstraints(button, c);
         add(button);
     }

     public void init() {
         GridBagLayout gridbag = new GridBagLayout();
         GridBagConstraints c = new GridBagConstraints();

         setFont(new Font("SansSerif", Font.PLAIN, 14));
         setLayout(gridbag);

         c.fill = GridBagConstraints.BOTH;
         c.weightx = 1.0;
         makebutton("Button1", gridbag, c);
         makebutton("Button2", gridbag, c);
         makebutton("Button3", gridbag, c);

         c.gridwidth = GridBagConstraints.REMAINDER; //end row
         makebutton("Button4", gridbag, c);

         c.weightx = 0.0;                //reset to the default
         makebutton("Button5", gridbag, c); //another row

         c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last in row
         makebutton("Button6", gridbag, c);

         c.gridwidth = GridBagConstraints.REMAINDER; //end row
         makebutton("Button7", gridbag, c);

         c.gridwidth = 1;                //reset to the default
         c.gridheight = 2;
         c.weighty = 1.0;
         makebutton("Button8", gridbag, c);

         c.weighty = 0.0;                //reset to the default
         c.gridwidth = GridBagConstraints.REMAINDER; //end row
         c.gridheight = 1;               //reset to the default
         makebutton("Button9", gridbag, c);
         makebutton("Button10", gridbag, c);

         setSize(300, 100);
     }

     public static void main(String args[]) {
         Frame f = new Frame("GridBag Layout Example");
         GridBagEx1 ex1 = new GridBagEx1();

         ex1.init();

         f.add("Center", ex1);
         f.pack();
         f.setSize(f.getPreferredSize());
         f.show();
     }
 }
 

導入されたバージョン:
1.0
関連項目: