GridBagLayoutについて

GridBagLayoutはきわめて柔軟かつ強力なレイアウトであり、グリッド内のコンポーネントのレイアウトをGridLayoutよりも厳密に制御します。GridBagLayoutでは、コンポーネントが動的な矩形グリッドに水平および垂直に配置されます。各コンポーネントのサイズが同じである必要はなく、複数のセルを埋めることもできます。

GridBagLayoutのイメージ

GridBagLayoutでは、各コンポーネントの制約と最小サイズ、およびコンテナの優先サイズに基づいてコンポーネントの位置が決定されます。

このトピックで使用する用語の意味は次のとおりです。

GridBagLayoutは複合グリッドに対応できますが、コンポーネントを小さいパネルに編成してGridBagLayoutコンテナ内でネストする方が正常に(かつ予測どおりに)動作します。このようにネストしたパネルでは、他のレイアウトを使用したり、必要に応じてさらにコンポーネント・パネルを含めることができます。この方法には、次の2つのメリットがあります。

一方、GridBagLayoutの方が使用するコンテナ数が多いため、他のレイアウト・マネージャを使用した場合に比べてプログラムのメモリー使用量が大きくなります。

GridBagConstraintsについて

GridBagLayoutでは、GridBagConstraintsオブジェクトを使用してGridBagLayoutコンテナ内の各コンポーネントのレイアウト情報を指定します。各コンポーネントとGridBagConstraintsオブジェクトには1対1の関連があるため、GridBagConstraintsオブジェクトはコンテナのコンポーネントごとにカスタマイズする必要があります。

GridBagLayoutのコンポーネントには、次の制約があります。

GridBagConstraintsを使用すると、次のことを制御できます。

Javaビジュアル・エディタでの使用と設定に関するヒントなど、各制約の詳細は、それぞれの制約に関する以降の各トピックを参照してください。

ソース・コードでのGridBagConstraintsの手動設定

Javaビジュアル・エディタを使用してGridBagLayoutコンテナを設計する場合、JDeveloperではコンテナに追加するコンポーネントごとに常に新規のGridBagConstraints2オブジェクトが作成されます。GridBagConstraintsGridBagConstraintsから導出され、GridBagConstraintsの11のプロパティをすべて使用するコンストラクタを持つため、Javaビジュアル・エディタで生成されるコードを単純化できます。

次に例を示します。

bevelPanel1.add(textFieldControl3, new GridBagConstraints2(0, 5, 6, 2, 1.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 24, 0, 0), 150, 0));
bevelPanel1.add(checkboxControl1, new GridBagConstraints2(7, 5, 4, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(8, 29, 0, 24), 18, -11));

GridBagConstraints2コンストラクタのパラメータは、ソース・コード内で直接変更するか、「制約」プロパティ・エディタを使用して値を変更できます。

GridBagLayoutコンテナを手動でコーディングして作成する場合は、単にGridBagLayoutコンテナごとにGridBagConstraintsオブジェクトを1つ作成します。GridBagLayoutでは、コンテナに追加したコンポーネントにGridBagConstraintsのデフォルト値が使用されるか、または最後に変更された値が再利用されます。コンテナに追加するコンポーネントで特定の制約に異なる値を使用する場合は、そのコンポーネントの新しい制約値を指定します。この新しい値は、以降のコンポーネントに対しても、再変更するまで有効となります。

注意: GridBagLayoutのこのコーディング方法は最も単純ですが(前に追加したコンポーネントの制約値が再利用されます)、そのコンテナをJavaビジュアル・エディタで視覚的に編集することはできません。

Javaビジュアル・エディタで使用する既存のGridBagLayoutコードの変更

前にGridBagConstraintsオブジェクトの1つを使用してGridBagLayoutコンテナを手動でコーディングしている場合、そのコンテナをJavaビジュアル・エディタで編集するにはコードを次のように変更する必要があります。

Javaビジュアル・エディタでのGridBagLayoutの視覚的な設計

GridBagLayoutは、複雑ですが便利なレイアウト・マネージャです。JDeveloperのJavaビジュアル・エディタには、GridBagLayoutを容易に設計および制御できるように、「制約」プロパティ・エディタ、グリッド、選択したコンポーネントのポップアップ・メニューなどの機能も用意されています。

Javaビジュアル・エディタでGridBagLayoutを設計するには2つの方法があります。つまり、GridBagLayoutパネルにコンポーネントを追加することで新規に設計する方法と、別のレイアウト(XYLayoutなど)を使用してJavaビジュアル・エディタでパネルのプロトタイプを作成し、必要に応じてコンポーネントの配列とサイズをすべて指定した後でGridBagLayoutに変換する方法です。この方法を使用すると、設計作業の所要時間を大幅に短縮できます。

どちらの方法を使用する場合も、ネストしたパネルを使用してコンポーネントをグループ化し、内側から作成していくことをお薦めします。これらのパネルを使用してGridBagLayoutコンテナの大部分を定義すると、GridBagLayout設計が簡素化され、グリッドのセル数とGridBagConstraintsを必要とするコンポーネントの数を減らすことができます。

GridBagLayoutへの変換

レイアウトのプロトタイプを最初に別のレイアウト内に作成する場合、最初に配置するときにパネルとコンポーネントを慎重に(特に左と上で)位置合せすれば、GridBagLayoutへの変換がはるかに明確かつ容易になります。実際にはグリッドを設計するため、コンポーネントを想像上のグリッド内に配置し、ネストしたパネルを使用して行数と列数を最小限に抑えるように注意してください。プロトタイプの作成にXYLayoutを使用すると、コンポーネントのポップアップ・メニュー(Javaビジュアル・エディタでコンポーネントを右クリックしてアクセス)でコンポーネント位置合せ機能を利用できます。

Javaビジュアル・エディタでは設計がGridBagLayoutに変換されるため、コンテナをGridBagLayoutに変更する前のコンポーネントの配置に基づいて、コンポーネントに制約値が割り当てられます。微調整が必要な場合があります。

GridBagLayoutへの変換により、特定のタイプのコンポーネント(テキスト領域、フィールド、グループ・ボックスまたはリストなど、通常は実行時にコンテナが拡大されるにつれてサイズが大きくなると予想されるコンポーネント)にweight制約が割り当てられます。GridBagLayoutに変換した後で設計の調整が必要になった場合は、最初にコンポーネントからweight制約をすべて削除(すべてを0に設定)すると、タスクが容易になります。

コンテナ内のすべてのコンポーネント間には複雑な相互作用があるため、0より大きいweight制約値を持つコンポーネントが1つでも存在すると、Javaビジュアル・エディタでサイズ変更動作を予測するのは困難です。

weight制約付きのコンポーネントを含むGridBagLayoutを見つけるのは簡単です。これは、コンポーネントがコンテナの中央に集まることはないためです。かわりに、コンポーネントがコンテナの端まで最大化されます。

ヒント: GridBagLayout内のコンポーネントからweightをすべて削除すると、次のいずれかの動作が発生します。

weightの使用方法と、各コンポーネントの相互作用への影響の詳細は、weight制約に関する以降のトピックを参照してください。

GridBagLayoutコンテナへのコンポーネントの追加

GridBagLayoutの作成時に新規GridBagLayoutコンテナにすべてのコンポーネントを追加する方法をとる場合は、次のように特定の動作を予想する必要があります。

「制約」プロパティ・エディタでのGridBagConstraintsの設定

GridBagLayoutの「制約」プロパティ・エディタを使用すると、Javaビジュアル・エディタで一部のGridBagConstraintsを指定でき、ソース・コードを編集する必要がありません。

「制約エディタ」

「制約」プロパティ・エディタを制約の設定に使用する大きなメリットの1つは、複数のコンポーネントの制約を同時に変更できることです。たとえば、GridBagLayoutコンテナ内のすべてのボタンに同じ内部余白を使用する場合は、[Shift]キーを押しながらボタンを1つずつ選択し、「制約」プロパティ・エディタを開いて制約を編集できます。

「制約」プロパティ・エディタを使用する手順は、次のとおりです。

  1. 「構造」ウィンドウまたはJavaビジュアル・エディタで、GridBagLayoutコンテナ内で変更するコンポーネントを選択します。
  2. プロパティ・インスペクタでconstraintsプロパティを選択し、「値」フィールドをクリックします。
  3. プロパティ・エディタで必要な制約を設定して「OK」をクリックします。

グリッドの表示

Javaビジュアル・エディタにはオプションのグリッドが表示され、レイアウトに含まれる各セルおよびコンポーネントの操作結果を正確に確認できます。

マウスによる制約の変更

Javaビジュアル・エディタでは、マウスを使用してコンポーネント全体をドラッグするか、コンポーネントの各種サイズ変更ニブを操作して一部の制約を設定できます。制約を視覚的に設定する手順は、制約に関する以降の各トピックを参照してください。

GridBagLayoutのポップアップ・メニューの使用

GridBagLayoutコンポーネントを右クリックするとポップアップ・メニューが表示されます。このメニューから「制約」プロパティ・エディタの一部のプロパティに容易にアクセスし、特定の制約をすばやく設定または削除できます。

メニュー・コマンド

アクション

グリッドの表示

Javaビジュアル・エディタにGridBagLayoutのグリッドが表示されます。

余白の削除

選択したコンポーネントのサイズ・パディング値(ipadxおよびipady)が0(ゼロ)に設定されます。

制約

選択したGridBagLayoutコンポーネントの「制約」ポップアップ・エディタが表示されます。

水平方向に最大サイズ化

コンポーネントのfill制約の値がHORIZONTALに設定(OR)されます。コンポーネントが拡張され、セルが水平方向に最大化されます。fillがVERTICALだった場合、制約はBOTHに設定されます。

垂直方向に最大サイズ化

コンポーネントのfill制約の値がVERTICALに設定(OR)されます。コンポーネントが拡張され、セルが垂直方向に最大化されます。fillがHORIZONTALだった場合、制約はBOTHに設定されます。

最大サイズ化の削除

コンポーネントのfill制約の値がNONEに変更されます。

水平方向のスペース配分

コンポーネントのweightx制約の値が1.0に設定されます。

垂直方向のスペース配分

コンポーネントのweighty制約の値が1.0に設定されます。

スペース配分の削除

コンポーネントのweighty制約とweighty制約の値が両方とも0.0に設定されます。

GridBagConstraints

この項では、各GridBagConstraintsについて個別に説明します。各制約の定義、有効な値とデフォルトの値、その制約をJavaビジュアル・エディタで視覚的に設定する方法について説明します。

anchor

説明
コンポーネントが表示領域よりも小さい場合は、anchor制約を使用し、レイアウト・マネージャに対して領域内のコンポーネントの配置場所を指示します。
anchor制約は、表示領域内のコンポーネントにのみ、そのコンポーネントのfill制約に応じて影響します。たとえば、コンポーネントのfill制約の値がGridBagConstraints.BOTH(表示領域を水平方向と垂直方向の両方で最大化)の場合、anchor制約は影響しません。これは、コンポーネントが使用可能領域全体を占めているためです。anchor制約を有効にするには、fill制約の値をGridBagConstraints.NONEGridBagConstraints.HORIZONTALまたはGridBagConstraints.VERTICALに設定します。

有効な値

GridBagConstraints.CENTER
GridBagConstraints.NORTH
GridBagConstraints.NORTHEAST
GridBagConstraints.EAST
GridBagConstraints.SOUTHEAST
GridBagConstraints.SOUTH
GridBagConstraints.SOUTHWEST
GridBagConstraints.WEST
GridBagConstraints.NORTHWEST

デフォルトの値

GridBagConstraints.CENTER

Javaビジュアル・エディタでのanchor制約の設定
セルよりも小さいコンポーネントのanchorは、マウスを使用して設定できます。移動可能なツールバーをドッキングする場合と同様に、単にコンポーネントをクリックし、表示領域の端にある目的の場所へドラッグします。たとえば、ボタンをセルの左上隅に配置指定するには、ボタンの中央でマウスをクリックし、ボタンの左上隅がセルの左上隅に接するまでドラッグします。これにより、anchor制約の値がNorthWestに設定されます。

anchor制約は、「制約」プロパティ・エディタでも次の手順で指定できます。
 

  1. Javaビジュアル・エディタでコンポーネントを選択します。
  2. プロパティ・インスペクタで、「constraints」プロパティをクリックして「制約エディタ」を表示します。
  3. アンカー領域で、anchor制約に必要な値を選択して「OK」をクリックします。

fill

説明
コンポーネントの表示領域がコンポーネントに必要なサイズよりも大きい場合は、fill制約を使用し、レイアウト・マネージャに対して表示領域でコンポーネントに使用する部分を指示します。anchor制約の場合と同様に、fill制約は独自の表示領域内のコンポーネントにのみ影響します。fillはレイアウト・マネージャに対し、コンポーネントを拡張して与えられた領域全体を埋めるように指示します。

有効な値

GridBagConstraints.NONE

(コンポーネントのサイズは変更されません。)

GridBagConstraints.BOTH

(コンポーネントはサイズ変更され、水平方向と垂直方向の両方で領域全体に収まるように最大サイズ化されます。)

GridBagConstraints.HORIZONTAL

(コンポーネントはサイズ変更され、領域に収まるように水平方向でのみ最大サイズ化されます。)

GridBagConstraints.VERTICAL

(コンポーネントはサイズ変更され、領域に収まるように垂直方向でのみ最大サイズ化されます。)


デフォルトの値

GridBagConstraints.NONE

Javaビジュアル・エディタでのfill制約の指定

コンポーネントのfill制約を最も短時間で指定する方法は、Javaビジュアル・エディタでコンポーネントのポップアップ・メニューを使用することです。

  1. Javaビジュアル・エディタでコンポーネントを右クリックしてポップアップ・メニューを表示します。
  2. 次のいずれかの操作を行います。
    • 「水平方向に最大サイズ化」を選択して値を「HORIZONTAL」に設定します。
    • 「垂直方向に最大サイズ化」を選択して値を「VERTICAL」に設定します。
    • 「水平方向に最大サイズ化」「垂直方向に最大サイズ化」の両方を選択し、値をBOTHに設定します。
    • 「最大サイズ化の削除」を選択して値をNONEに設定します。

fill制約は「制約エディタ」でも指定できます。

  1. プロパティ・インスペクタで、「constraints」プロパティをクリックして「制約エディタ」を表示します。
  2. 「最大サイズ化」領域で、fill制約に必要な値を選択して「OK」をクリックします。

gridwidth、gridheight

説明

この2つの制約を使用して、コンポーネントで使用する1行のセル数( gridwidth)または1列のセル数(gridheight)を指定します。この制約の値は、ピクセルではなくセル数で表されます。

有効な値

gridwidth=nngridheight=nn

nnは、セルの列数または行数を表す整数です。)

GridBagConstraints.RELATIVE (-1)

このコンポーネントを行(gridwidth)または列(gridheight)の最後のコンポーネントの横に配置するように指定します。GridBagConstraints.RELATIVEを持つコンポーネントには、最後のセルを除く残りのセルがすべて使用されます。たとえば、6列で構成される行では、コンポーネントが第3列から始まる場合、gridwidthがRELATIVEであれば第3、第4および第5列を占めることになります。

GridBagConstraints.REMAINDER (0)

このコンポーネントが行(gridwidth)または列(gridheight)の最後のコンポーネントになるように指定します。


デフォルトの値

gridwidth=1gridheight=1

Javaビジュアル・エディタでのgridwidthおよびgridheight制約の指定

gridwidthおよびgridheight制約の値は、「制約」プロパティ・エディタで指定できます。

  1. プロパティ・インスペクタで、「constraints」プロパティをクリックして「制約エディタ」を表示します。
  2. 「グリッド位置」領域で、「幅」フィールドにgridwidthの値を入力するか、「高さ」フィールドにgridheightの値を入力します。コンポーネントが行または列に占めるセルの数を指定します。
    • 値をRELATIVEにする場合は、-1を入力します。
    • 値をREMAINDERにする場合は、0を入力します。
マウスを使用してコンポーネントのサイズを隣接する空のセルにあわせて調整すると、gridwidthまたは gridheightを変更できます。

gridx、gridy

説明

この2つの制約を使用して、コンポーネントの左上隅のグリッド・セルの位置を指定します。gridx=0は左の第1列、gridy=0は上の第1行です。したがって、制約gridx=0およびgridy=0を持つコンポーネントは、グリッドの第1セル(左最上部)に配置されます。

GridBagConstraints.RELATIVEでは、次のように、コンポーネントを直前のコンポーネントに対する相対位置に配置するように指定します。

有効な値

gridx=nn、gridy=nn
GridBagConstraints.RELATIVE (-1)

GridBagLayoutがサポートする行数と列数の最大値は512です。したがって、XおよびYには512以下の値を指定する必要があります。

デフォルトの値

gridx=0、gridy=0

Javaビジュアル・エディタでのグリッド・セル位置の指定

マウスを使用して、コンポーネントの左上隅が占めるセルを指定できます。コンポーネントの左上隅の付近をクリックし、新規セルにドラッグします。複数のセルを占めるコンポーネントを移動する場合は、コンポーネントを選択するときに必ず左上のセルをクリックしてください。そのコンポーネントの他の制約に指定されている値が原因で、コンポーネントをマウスで新規セルに移動すると、他の制約の値が変化することがあります。たとえば、コンポーネントが占めるセルの数が変化することがあります。他の制約を誤って変更することなくgridxおよびgridy制約を正確に指定するには、「制約」プロパティ・エディタを使用します。
 
  1. プロパティ・インスペクタで、「constraints」プロパティをクリックして「制約エディタ」を表示します。
  2. 「グリッド位置」領域で、「X」フィールドにgridx値の列番号を入力するか、「Y」フィールドにgridy値の行番号を入力します。値をRELATIVEにする場合は、-1を入力します。

重要: マウスを使用してコンポーネントを使用セルに移動する場合、Javaビジュアル・エディタでは、2つのコンポーネントがオーバーラップしないように、セルの新規の1行と1列が挿入されます。そのため、各コンポーネントが他のコンポーネントの上に重なることはありません。「制約」プロパティ・エディタを使用してコンポーネントの配置を変更する場合、Javaビジュアル・エディタではコンポーネントがオーバーラップするかどうかがチェックされません

insets

説明

insetsを使用して、コンポーネントと表示領域の端の間の外部スペース(余白)の最小量をピクセル単位で指定します。insetでは、コンポーネントの端およびセルの対応する端の間に常に指定のギャップを保つ必要があることを指定します。したがって、insetsはコンポーネントをセルの端から離しておくためのブレーキのような役割を果たします。たとえば、左右のinsetsを持つコンポーネントの幅をセルよりも広くなるように増やすと、セルはコンポーネントとinsetsが収まるように拡張されます。fillおよびpadding制約によりinsetsからスペースが借用されることはありません。

有効な値

insets = new Insets(n,n,n,n)

上、左、下、右(各パラメータは表示領域とセルの一方の端の間隔をピクセル数で表します)。

デフォルトの値

insets = new Insets(0,0,0,0)

Javaビジュアル・エディタでのinset値の設定

Javaビジュアル・エディタでは、選択したGridBagLayoutコンポーネント上に、insetsの位置とサイズを示す青いサイズ変更ニブが表示されます。青いニブ(サイズ変更ハンドル)をマウスで選択してドラッグし、insetのサイズを増減させます。

insetの値をより正確に制御するには、「制約」プロパティ・エディタを使用して正確なピクセル数を指定します。
  1. プロパティ・インスペクタで、「constraints」プロパティをクリックして「制約エディタ」を表示します。
  2. 「外枠までの空間」領域で、各 inset(上、左、下または右)のピクセル数を指定します。
     
負のinset値は有効ですが、指定するとコンポーネントが隣のコンポーネントにオーバーラップすることがあるためお薦めしません。

ipadx、ipady

説明
この2つの制約では、コンポーネントの内部余白を指定します。ipadxおよびipadyを使用し、コンポーネントの最小サイズに内部余白用として追加するスペースの大きさ(ピクセル単位)を指定します。たとえば、コンポーネントの幅は、最小幅とipadx(ピクセル単位)の合計以上になります。コードでは1度のみ追加され、コンポーネントの両側で均等に分割されます。同様に、コンポーネントの高さは、最小の高さとipadyのピクセル数の合計以上になります。

例:

優先サイズが幅30ピクセル、高さ20ピクセルのコンポーネントに追加するとします。

有効な値

ipadx=nnipadx=nn

デフォルトの値

ipadx=0ipady=0

Javaビジュアル・エディタでの内部余白サイズの制約の設定

コンポーネントの内部余白のサイズを指定するには、コンポーネントの端にある黒いサイズ変更ニブのいずれかをクリックしてマウスでドラッグします。

余白値をより正確に制御するには、「制約」プロパティ・エディタを使用して値に使用する正確なピクセル数を指定します。

  1. プロパティ・インスペクタで、「constraints」プロパティをクリックして「制約エディタ」を表示します。

  2. 「サイズ・パディング」領域で、「幅」と「高さ」にピクセル数を入力して「OK」をクリックします。

余白をすばやく削除(0に設定)するには、Javaビジュアル・エディタでコンポーネントを右クリックして「余白の削除」を選択します。複数のコンポーネントを選択し、同じ手順で1度にすべてのコンポーネントから余白を削除することもできます。

負の値は有効です。負の値を指定すると、コンポーネントが優先サイズよりも小さくなります。

注意: パディングはXYLayoutに似ていますが、コンピュータ・システムや言語によっては正確でない場合があります。

weightx、weighty

説明
weight制約を使用して、GridBagLayoutコンテナの余分なスペースをサイズ変更時に水平方向(weightx)および垂直方向(weighty)にどのように配分するかを指定します。weightにより、コンテナをデフォルト・サイズより大きく拡大した場合に、各セルおよびコンポーネントに配分される余分なスペースの割合が決定されます。

「スペース配分」の値はdouble型で、 0.0から 1.0の範囲の数値で指定します。ゼロは、コンポーネントにはスペースを設定できないことを示し、 1.0は、コンポーネントがスペースを完全に共有することを示します。

有効な値

weightx=n.nweighty=n.n

デフォルトの値

weightx=0.0weighty=0.0

Javaビジュアル・エディタでのweightxおよびweighty制約の設定

Javaビジュアル・エディタでコンポーネントのweight制約を指定するには、コンポーネントを右クリックして「水平方向のスペース配分」weightx)または「垂直方向のスペース配分」weighty)を選択します。これにより、値が1.0に設定されます。weightを削除(0に設定)するには、コンポーネントを右クリックして「スペース配分の削除」を選択します。この操作を複数のコンポーネントに対して実行できます。[Shift]キーを押しながら各コンポーネントを選択し、右クリックして適切なメニュー項目を選択します。

weight制約を0.0または1.0以外の値に設定する場合は、「制約エディタ」で値を設定できます。
 

  1. プロパティ・インスペクタで、「constraints」プロパティをクリックして「制約エディタ」を表示します。

  2. 「スペース配分」領域で、「X」(weightx)または「Y」(weighty)に0.0から1.0の値を入力して「OK」をクリックします。

重要: weight制約を使用すると、Javaビジュアル・エディタでのサイズ変更動作を予想するのが難しくなることがあるため、これらの制約はGridBagLayout設計の最終ステップで設定してください。

weight制約がコンポーネントの動作に及ぼす影響の例

GridBagLayout GridBagConstraintsの詳細は、J2SE(Java 2、Standard Edition)のドキュメントの「GridBagLayout」および「GridBagConstraints」を参照してください。