GridBagLayout
は非常に柔軟で強力なレイアウトで、GridLayout
よりも自由にグリッドにコンポーネントを配置できます。GridBagLayout
は、動的な長方形のグリッド上にコンポーネントを水平および垂直に配置します。コンポーネントを同じサイズにする必要はなく、1つのコンポーネントが複数のセルを占有する場合もあります。
GridBagLayout
では、各コンポーネントのconstraints
と最小サイズ、さらにコンテナの優先サイズに基づいて、コンポーネントの配置が決まります。
この後の説明では、
GridBagLayoutは複雑なグリッドに対応しますが、コンポーネントは小さいパネルに編成し、GridBagLayout
コンテナ内にネストすると、より効果的に(そして期待どおりに)機能します。 このようなネストされたパネルでは、他のレイアウトを使用でき、必要であればコンポーネントのパネルを追加できます。この方法には次の2つの利点があります。
GridBagLayout
が単純になり、非常に制御しやすくなります。
ただしGridBagLayout
は多くのコンテナを必要とするため、プログラムが必要とするメモリー量は他のレイアウト・マネージャより多くなります。
GridBagConstraintsについて
GridBagLayout
ではGridBagConstraints
オブジェクトを使用し、GridBagLayout
コンテナ内の各コンポーネントのレイアウト情報を指定します。各コンポーネントとGridBagConstraints
オブジェクトの間の関係は1対1であるため、コンテナのコンポーネントごとに、GridBagConstraints
オブジェクトをカスタマイズする必要があります。
GridBagLayout
コンポーネントには、次の制約があります。
GridBagConstraints
により、次のものを制御できます。
Javaビジュアル・エディタでの使用や設定のヒントを含め、各制約の詳細な説明は、後述の個々の制約のセクションを参照してください。
ソース・コードでのGridBagConstraintsの手動設定
Javaビジュアル・エディタを使用してGridBagLayout
コンテナを設計すると、コンテナに追加する各コンポーネントに対して、常に新しいGridBagConstraints2
オブジェクトが作成されます。GridBagConstraints
はGridBagConstraints
から導出され、Javaビジュアル・エディタで生成されるコードを簡潔にするためにGridBagConstraints
の11のプロパティすべてを引数とするコンストラクタを持ちます。
次に例を示します。
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));
GridBagConstraints
コンストラクタのパラメータをソース・コード内で直接変更することも、「制約」プロパティ・エディタを使用して値を変更することもできます。
手動でコーディングしてGridBagLayout
コンテナを作成する場合、各GridBagLayout
コンテナに対して作成する必要のあるGridBagConstraints
オブジェクトは1つのみです。GridBagLayout
では、コンテナに追加したコンポーネントに対して、GridBagConstraints
のデフォルト値または最後に変更された値が使用されます。コンテナに追加するコンポーネントに、特定の制約について異なる値を設定する場合、そのコンポーネントの新規の制約値を指定するだけです。この新規の値は、再び変更されないかぎり、後から追加するコンポーネントについても有効です。
注意: GridBagLayout
のこのコーディング方法は最も効率がよい(以前追加したコンポーネントから制約値を再利用する)方法ですが、このようにして作成したコンテナはJavaビジュアル・エディタでビジュアルに編集することはできません。
既存のGridBagLayoutコードのJavaビジュアル・エディタ向け変更
1つのGridBagConstraints
オブジェクトを使用して以前に手動でコーディングしたGridBagLayout
コンテナがある場合、Javaビジュアル・エディタでそのコンテナを編集するには、コードに次のような変更を加える必要があります。
GridBagConstraints
を作成します。GridBagConstraints
オブジェクトには、前述の11の各制約値に対するパラメータを持つ大きなコンストラクタが1つ必要です。
Javaビジュアル・エディタでのGridBagLayoutのビジュアル設計
GridBagLayout
は複雑ですが、便利なレイアウト・マネージャです。 Javaビジュアル・エディタには、制約プロパティ・エディタ、グリッド、選択したコンポーネント上のポップアップ・メニューなど、GridBagLayout
の設計と制御をより簡単にする機能があります。
Javaビジュアル・エディタでGridBagLayout
を設計するには、2つの方法があります。 GridBagLayout
パネルにコンポーネントを追加して最初から設計することも、まずXYLayout
などの別のレイアウトを利用してJavaビジュアル・エディタでパネルのプロトタイプを作成し、すべてのコンポーネントを希望どおりに配列してサイズを設定した後で、GridBagLayout
に変換することもできます。この方法により、設計時間を大幅に短縮できます。
どちらの方法を使用する場合でも、コンポーネントをグループ化するためのネストされたパネルを利用し、中から外へ構築していくことをお薦めします。これらのパネルを使用して、GridBagLayout
コンテナの主要領域を定義し、GridBagLayout
設計を簡略化します。これによりグリッド内のセルが減り、GridBagConstraints
を必要とするコンポーネントが少なくなります。
GridBagLayoutへの変換
最初に別のレイアウトでレイアウトのプロトタイプを作成する場合、パネルやコンポーネントを最初に配置する際のその位置揃え、特に左揃えと上揃えに注意すると、GridBagLayout
への変換が非常に手際よく容易にできます。 実際はグリッドを設計していることを念頭に置いて、仮想のグリッド内にコンポーネントを配置するようにし、行数と列数をできるだけ少なくするためにネストされたパネルを使用してください。 プロトタイプ作成にXYLayout
を使用すると、コンポーネントのポップアップ・メニュー(Javaビジュアル・エディタ内でコンポーネントを右クリックしてアクセス)上で、コンポーネントの位置揃え機能を利用できます。
Javaビジュアル・エディタで設計内容をGridBagLayout
に変換すると、コンテナをGridBagLayout
に変更する前のコンポーネントの位置に基づいて、コンポーネントの制約値が割り当てられます。調整が必要な場合でも、小さな調整のみで済むことがほとんどです。
GridBagLayout
への変換により、一部のコンポーネント(テキスト領域、フィールド、グループ・ボックスまたはリストなど、実行時にコンテナが広がるため、通常はサイズが大きくなることが予想されるもの)には、weight制約(スペース配分)が割り当てられます。 GridBagLayout
への変換後、設計を調整する必要がある場合、すべてのコンポーネントからまずweight制約を削除(すべて0(ゼロ)に設定)すれば、作業が非常に楽になります。
weight制約値が0(ゼロ)より大きいコンポーネントが1つでもあれば、コンテナ内の全コンポーネント間の複雑な相互作用により、Javaビジュアル・エディタ内のサイズ設定の動作が予測しにくくなります。
コンポーネントがスペース配分されているGridBagLayout
は、コンポーネントがコンテナの中央に集まらないため、簡単に見つけることができます。かわりに、コンポーネントはコンテナの枠まで広がります。
ヒント: GridBagLayout
でコンポーネントからスペース配分をすべて取り消すと、次のいずれかが発生します。
GridBagLayout
コンテナがメインのUIframe
の中央にある1つのパネルの場合、frame
のサイズを拡大してください。このコンテナは、コンポーネントの全制約の設定終了後に、最終的なサイズに変更できます。
スペース配分の使用方法、スペース配分がコンポーネントの相互作用に与える影響の詳細は、後述のweight制約に関するセクションを参照してください。
GridBagLayoutコンテナへのコンポーネントの追加
新規のGridBagLayout
コンテナを作成し、すべてのコンポーネントを最初から追加してGridBagLayout
を作成する場合、次のような動作が予想されます。
「制約」プロパティ・エディタでのGridBagConstraintsの設定
GridBagLayout
の制約プロパティ・エディタを使用すると、一部のGridBagConstraints
はJavaビジュアル・エディタで指定でき、ソース・コードを編集する必要はありません。
制約の設定に「制約」プロパティ・エディタを使用する大きな利点の1つは、複数のコンポーネントの制約を同時に変更できることです。 たとえば、GridBagLayout
コンテナ内のすべてのボタンで同じ内部パディングを使用する場合、[Shift]キーを押しながら各ボタンを選択した後、制約プロパティ・エディタを開いて制約を編集できます。
「制約」プロパティ・エディタを使用するには、次のようにします。
GridBagLayout
コンテナ内の変更するコンポーネントを、構造ウィンドウまたはJavaビジュアル・エディタで選択します。constraints
プロパティを選択し、その値フィールドをクリックします。グリッドの表示
Javaビジュアル・エディタには、レイアウト内の各セルおよびコンポーネントの状態を正確に把握するためのグリッドを、オプションで表示できます。
GridBagLayout
コンテナでコンポーネントを右クリックし、「グリッドの表示」を選択します。GridBagLayout
コンテナにないコンポーネント(GridBagLayout
コンテナ自体も含む)をクリックします。グリッドは、GridBagLayout
コンテナ内のコンポーネントが選択されている場合にのみ表示されます。マウスを使用した制約変更
Javaビジュアル・エディタでは、コンポーネント全体をドラッグするか、コンポーネント上の各サイズ変更ハンドルをクリックすることで、一部の制約をマウスで設定できます。制約をビジュアルに設定する方法は、後述の制約の各セクションで説明します。
GridBagLayoutポップアップ・メニューの使用
GridBagLayoutコンポーネントを右クリックすると、制約プロパティ・エディタの一部のプロパティに簡単にアクセスできるポップアップ・メニューが表示され、一部の制約を簡単に設定または削除できます。
メニュー・コマンド |
アクション |
---|---|
グリッドの表示 |
Javaビジュアル・エディタに |
パディングの削除 |
選択したコンポーネントのすべてのサイズのパディング値( |
制約... |
選択した |
水平方向に最大サイズ化 |
コンポーネントの最大サイズ化(fill)制約値をHORIZONTALに設定します。コンポーネントはセルの水平方向に最大サイズ化されます。 fillがVERTICALであった場合、制約はBOTHに設定されます。 |
垂直方向に最大サイズ化 |
コンポーネントの最大サイズ化(fill)制約値をVERTICALに設定します。コンポーネントはセルの垂直方向に最大サイズ化されます。 fillがHORIZONTALであった場合、制約はBOTHに設定されます。 |
最大サイズ化しない |
コンポーネントの最大サイズ化(fill)制約値をNONEに変更します。 |
水平方向のスペース配分 |
コンポーネントのX方向のスペース配分(weightx)を1.0に設定します。 |
垂直方向のスペース配分 |
コンポーネントのY方向のスペース配分(weighty)を1.0に設定します。 |
スペース配分しない |
コンポーネントのスペース配分(weightx、weighty)をどちらも0.0に設定します。 |
次のセクションでは、各GridBagConstraints
を個別に説明します。 各制約の内容と有効値およびデフォルト値を記載し、Javaビジュアル・エディタでビジュアルに設定する方法を説明します。
GridBagConstraints.BOTH
(表示領域の水平、垂直両方向に最大サイズ化される)の場合、コンポーネントが使用可能な領域全体を占有するため、anchor制約は影響を与えません。 anchor制約を有効にするには、fill制約の値をGridBagConstraints.NONE
、GridBagConstraints.HORIZONTAL
またはGridBagConstraints.VERTICAL
に設定します。 有効値:
GridBagConstraints.CENTER
GridBagConstraints.NORTH
GridBagConstraints.NORTHEAST
GridBagConstraints.EAST
GridBagConstraints.SOUTHEAST
GridBagConstraints.SOUTH
GridBagConstraints.SOUTHWEST
GridBagConstraints.WEST
GridBagConstraints.NORTHWEST
デフォルト値:
GridBagConstraints.CENTER
制約プロパティ・エディタでも、anchor制約を設定できます。
constraints
プロパティをクリックし、制約プロパティ・エディタを表示します。 有効値:
GridBagConstraints.NONE
(コンポーネントのサイズを変更しません。)
GridBagConstraints.BOTH
(領域の垂直、水平両方向に最大になるよう、コンポーネントのサイズを変更します。)
GridBagConstraints.HORIZONTAL
(領域の水平方向にのみ最大になるよう、コンポーネントのサイズを変更します)
GridBagConstraints.VERTICAL
(領域の垂直方向にのみ最大になるよう、コンポーネントのサイズを変更します。)
デフォルト値:
GridBagConstraints.NONE
Javaビジュアル・エディタでのfill制約の指定
コンポーネントのfill制約を指定する最も簡単な方法は、Javaビジュアル・エディタでコンポーネントのポップアップ・メニューを使用する方法です。
制約プロパティ・エディタでも、fill制約を指定できます。
constraints
プロパティをクリックし、制約プロパティ・エディタを表示します。説明:
有効値:
gridwidth=nn
, gridheight=nn
(ここでnn
は、セルの列数または行数を表す整数です。)
GridBagConstraints.RELATIVE (-1)
このコンポーネントが行(gridwidth)または列(gridheight)の最後から2番目のコンポーネントであることを指定します。GridBagConstraints.RELATIVEを指定したコンポーネントは、最後のセルを除く残りのセルすべてを使用します。たとえば、6列の行で、コンポーネントが3番目の列から始まった場合、RELATIVEのgridwidthを指定すると、コンポーネントは第3、第4および第5列を使用することになります。
GridBagConstraints.REMAINDER (0)
このコンポーネントが行(gridwidth)または列(gridheight)の最後のコンポーネントであることを指定します。
デフォルト値:
|
|
Javaビジュアル・エディタでのgridwidthおよびgridheight制約の指定
制約プロパティ・エディタで、gridwidthおよびgridheight制約値を指定できます。
constraints
プロパティをクリックし、制約プロパティ・エディタを表示します。説明:
gridx=0
は最も左の列、gridy=0
は最も上の行です。したがって、gridx=0
およびgridy=0
制約を指定したコンポーネントは、グリッドの最初のセル(最も上の左)に配置されます。
GridBagConstraints.RELATIVE
により、次のように、コンポーネントが前のコンポーネントと相対的に配置されるよう指定します。
gridx
とともに使用すると、このコンポーネントが、最後に追加されたコンポーネントのすぐ右に置かれます。gridy
とともに使用すると、このコンポーネントが、最後に追加されたコンポーネントのすぐ下に置かれます。有効値:
gridx=nn, gridy=nn
GridBagConstraints.RELATIVE (-1)
GridBagLayoutでは、最大512の行および列がサポートされます。したがって、XおよびYに指定する値は512を超えないようにする必要があります。
デフォルト値:
gridx=0, gridy=0
constraints
プロパティをクリックし、制約プロパティ・エディタを表示します。説明:
有効値:
insets = new Insets(n,n,n,n)
上、左、下、右(各パラメータは、表示領域とセルの枠との間隔をピクセル数で表します。)
デフォルト値
insets = new Insets(0,0,0,0)
Javaビジュアル・エディタでのinset値の設定
inset値が0より大きい場合、Javaビジュアル・エディタではそのinsetに対して、セルの枠の上と表示領域の枠の上に1つずつ、1組の青いハンドルが表示されます。 insetのサイズは、2つのハンドル間の距離(ピクセル数)です。 いずれかのハンドルを使用して、insetのサイズを変更します。
constraints
プロパティをクリックし、制約プロパティ・エディタを表示します。 指定サイズが幅30ピクセル、高さ20ピクセルのコンポーネントに余白を指定すると、次のようになります。
有効値:
ipadx=nn
, ipadx=nn
デフォルト値:
ipadx=0
, ipady=0
Javaビジュアル・エディタでの内部パディング制約のサイズ設定
変更前
変更後
constraints
プロパティをクリックし、制約プロパティ・エディタを表示します。パディングを簡単に削除(0(ゼロ)に設定)するには、Javaビジュアル・エディタ内でコンポーネントを右クリックし、「パディングの削除」を選択します。複数のコンポーネントを選択し、同じ手順ですべてのコンポーネントから1度にパディングを削除することもできます。
double
型で、0.0から1.0の範囲(0.0と1.0を含む)の数値を指定します。 0(ゼロ)は、コンポーネントに余白が割り当てられないことを意味し、1.0はコンポーネントに余白がすべて割り当てられることを意味します。有効値:
weightx=n.n
, weighty=n.n
デフォルト値:
weightx=0.0
, weighty=0.0
Javaビジュアル・エディタでのweightxおよびweighty制約の設定
Javaビジュアル・エディタでコンポーネントのweight制約を指定するには、コンポーネントを右クリックし、「水平方向のスペース配分」(weightx)または「垂直方向のスペース配分」(weighty)を選択します。これにより、値は1.0に設定されます。スペース配分を取り消す(0(ゼロ)に設定する)には、コンポーネントを右クリックし、「スペース配分しない」を選択します。 これは複数のコンポーネントにも可能です。 [Shift]キーを押しながらコンポーネントを選択してから右クリックし、適切なメニュー項目を選択します。
weight制約を0.0または1.0以外の値に設定する場合、制約プロパティ・エディタで値を設定できます。
constraints
プロパティをクリックし、制約プロパティ・エディタを表示します。weight制約がコンポーネントの動作に与える影響の例
次の3つの図は、これを示したものです。
最初の例では、GridBagLayoutパネル内のすべてのコンポーネントのweight制約が、0(ゼロ)に設定されています。 この制約のため、コンポーネントはGridBagLayoutパネルの中央に集まり、パネル内の余白はすべて、グリッドおよびパネルの外枠の間に配分されています。 グリッドのサイズは、コンポーネントの指定サイズと、inset(外枠までの空間)およびパディング(ipadxまたはipady)によって決まります。
次の例では、ListControlの水平方向のweight制約に1.0が指定されています。 コンポーネントにweightを指定すると、UIはパネルの中央に配置されなくなります。 水平方向のweight制約が使用されたため、GridBagLayoutマネージャではグリッドのそれぞれの側に割り当てられていた余白を、ListControlの含まれたセルに割り当てます。 ListControlのサイズが変わっていないことにも注意してください。
ヒント: コンポーネントにweightを追加後、セル内に必要以上に余白ができた場合、余白が希望のサイズになるまで、UIのフレームのサイズを縮小します。 フレームのサイズを縮小するには、Javaビジュアル・エディタまたは構造ウィンドウでフレーム(BorderLayout)を選択し、黒いサイズ変更ハンドルをクリックしてフレームを希望のサイズまでドラッグします。
最後の例は、ListControlに水平方向のfillがさらに追加された場合です。コンポーネントは、新たに加わったセルの幅を埋めるために広がります。
GridBagLayoutおよびGridBagConstraintsの追加情報は、J2SE(Java2 Standard Edition)のドキュメントの「GridBagLayout」および「GridBagConstraints」を参照してください。
Copyright © 1997, 2004, Oracle Corporation. All rights reserved.