GridBagLayout
はきわめて柔軟かつ強力なレイアウトであり、グリッド内のコンポーネントのレイアウトをGridLayout
よりも厳密に制御します。GridBagLayout
では、コンポーネントが動的な矩形グリッドに水平および垂直に配置されます。各コンポーネントのサイズが同じである必要はなく、複数のセルを埋めることもできます。
GridBagLayout
では、各コンポーネントの制約
と最小サイズ、およびコンテナの優先サイズに基づいてコンポーネントの位置が決定されます。
このトピックで使用する用語の意味は次のとおりです。
GridBagLayoutは複合グリッドに対応できますが、コンポーネントを小さいパネルに編成してGridBagLayout
コンテナ内でネストする方が正常に(かつ予測どおりに)動作します。このようにネストしたパネルでは、他のレイアウトを使用したり、必要に応じてさらにコンポーネント・パネルを含めることができます。この方法には、次の2つのメリットがあります。
GridBagLayout
が簡素化されて制御が容易になります。
一方、GridBagLayout
の方が使用するコンテナ数が多いため、他のレイアウト・マネージャを使用した場合に比べてプログラムのメモリー使用量が大きくなります。
GridBagConstraintsについて
GridBagLayout
では、GridBagConstraints
オブジェクトを使用してGridBagLayout
コンテナ内の各コンポーネントのレイアウト情報を指定します。各コンポーネントとGridBagConstraints
オブジェクトには1対1の関連があるため、GridBagConstraints
オブジェクトはコンテナのコンポーネントごとにカスタマイズする必要があります。
GridBagLayout
のコンポーネントには、次の制約があります。
GridBagConstraints
を使用すると、次のことを制御できます。
Javaビジュアル・エディタでの使用と設定に関するヒントなど、各制約の詳細は、それぞれの制約に関する以降の各トピックを参照してください。
ソース・コードでのGridBagConstraintsの手動設定
Javaビジュアル・エディタを使用してGridBagLayout
コンテナを設計する場合、JDeveloperではコンテナに追加するコンポーネントごとに常に新規のGridBagConstraints2
オブジェクトが作成されます。GridBagConstraints
はGridBagConstraints
から導出され、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));
GridBagConstraints
2コンストラクタのパラメータは、ソース・コード内で直接変更するか、「制約」プロパティ・エディタを使用して値を変更できます。
GridBagLayout
コンテナを手動でコーディングして作成する場合は、単にGridBagLayout
コンテナごとにGridBagConstraints
オブジェクトを1つ作成します。GridBagLayout
では、コンテナに追加したコンポーネントにGridBagConstraints
のデフォルト値が使用されるか、または最後に変更された値が再利用されます。コンテナに追加するコンポーネントで特定の制約に異なる値を使用する場合は、そのコンポーネントの新しい制約値を指定します。この新しい値は、以降のコンポーネントに対しても、再変更するまで有効となります。
注意: GridBagLayout
のこのコーディング方法は最も単純ですが(前に追加したコンポーネントの制約値が再利用されます)、そのコンテナをJavaビジュアル・エディタで視覚的に編集することはできません。
Javaビジュアル・エディタで使用する既存のGridBagLayoutコードの変更
前にGridBagConstraints
オブジェクトの1つを使用してGridBagLayout
コンテナを手動でコーディングしている場合、そのコンテナをJavaビジュアル・エディタで編集するにはコードを次のように変更する必要があります。
GridBagConstraints
2オブジェクトを作成する必要があります。GridBagConstraints
2オブジェクトには、前述した11の制約値それぞれのパラメータを含む大きいコンストラクタが必要です。
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をすべて削除すると、次のいずれかの動作が発生します。
GridBagLayout
コンテナがメインUIframe
の中央にある単一パネルの場合は、frame
のサイズを拡大します。このコンテナのサイズは、すべてのコンポーネントの制約を設定し終わった後で最終的なサイズに変更できます。
weightの使用方法と、各コンポーネントの相互作用への影響の詳細は、weight制約に関する以降のトピックを参照してください。
GridBagLayoutコンテナへのコンポーネントの追加
GridBagLayout
の作成時に新規GridBagLayout
コンテナにすべてのコンポーネントを追加する方法をとる場合は、次のように特定の動作を予想する必要があります。
「制約」プロパティ・エディタでのGridBagConstraintsの設定
GridBagLayout
の「制約」プロパティ・エディタを使用すると、Javaビジュアル・エディタで一部のGridBagConstraints
を指定でき、ソース・コードを編集する必要がありません。
「制約」プロパティ・エディタを制約の設定に使用する大きなメリットの1つは、複数のコンポーネントの制約を同時に変更できることです。たとえば、GridBagLayout
コンテナ内のすべてのボタンに同じ内部余白を使用する場合は、[Shift]キーを押しながらボタンを1つずつ選択し、「制約」プロパティ・エディタを開いて制約を編集できます。
「制約」プロパティ・エディタを使用する手順は、次のとおりです。
GridBagLayout
コンテナ内で変更するコンポーネントを選択します。constraints
プロパティを選択し、「値」フィールドをクリックします。グリッドの表示
Javaビジュアル・エディタにはオプションのグリッドが表示され、レイアウトに含まれる各セルおよびコンポーネントの操作結果を正確に確認できます。
GridBagLayout
コンテナ内でコンポーネントを右クリックして「グリッドの表示」を選択します。GridBagLayout
コンテナに含まれていないコンポーネント(GridBagLayout
コンテナ自体を含む)をクリックします。これにより、グリッドが表示されなくなります。グリッドが表示されるのは、GridBagLayout
コンテナ内のコンポーネントが選択されている場合のみです。マウスによる制約の変更
Javaビジュアル・エディタでは、マウスを使用してコンポーネント全体をドラッグするか、コンポーネントの各種サイズ変更ニブを操作して一部の制約を設定できます。制約を視覚的に設定する手順は、制約に関する以降の各トピックを参照してください。
GridBagLayoutのポップアップ・メニューの使用
GridBagLayoutコンポーネントを右クリックするとポップアップ・メニューが表示されます。このメニューから「制約」プロパティ・エディタの一部のプロパティに容易にアクセスし、特定の制約をすばやく設定または削除できます。
メニュー・コマンド |
アクション |
---|---|
グリッドの表示 |
Javaビジュアル・エディタに |
余白の削除 |
選択したコンポーネントのサイズ・パディング値( |
制約 |
選択した |
水平方向に最大サイズ化 |
コンポーネントの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ビジュアル・エディタで視覚的に設定する方法について説明します。
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)の最後のコンポーネントの横に配置するように指定します。GridBagConstraints.RELATIVEを持つコンポーネントには、最後のセルを除く残りのセルがすべて使用されます。たとえば、6列で構成される行では、コンポーネントが第3列から始まる場合、gridwidthがRELATIVEであれば第3、第4および第5列を占めることになります。
GridBagConstraints.REMAINDER (0)
このコンポーネントが行(gridwidth)または列(gridheight)の最後のコンポーネントになるように指定します。
デフォルトの値
gridwidth=1
、gridheight=1
Javaビジュアル・エディタでのgridwidthおよびgridheight制約の指定
gridwidthおよびgridheight制約の値は、「制約」プロパティ・エディタで指定できます。
「constraints」
プロパティをクリックして「制約エディタ」を表示します。説明
gridx=0
は左の第1列、gridy=0
は上の第1行です。したがって、制約gridx=0
およびgridy=0
を持つコンポーネントは、グリッドの第1セル(左最上部)に配置されます。
GridBagConstraints.RELATIVE
では、次のように、コンポーネントを直前のコンポーネントに対する相対位置に配置するように指定します。
gridx
とともに使用すると、このコンポーネントを最後に追加したコンポーネントの右隣に配置するように指定できます。gridy
とともに使用すると、このコンポーネントを最後に追加したコンポーネントの直下に配置するように指定できます。有効な値
gridx=nn、gridy=nn
GridBagConstraints.RELATIVE (-1)
GridBagLayoutがサポートする行数と列数の最大値は512です。したがって、XおよびYには512以下の値を指定する必要があります。
デフォルトの値
gridx=0、gridy=0
Javaビジュアル・エディタでのグリッド・セル位置の指定
「constraints」
プロパティをクリックして「制約エディタ」を表示します。説明
有効な値
insets = new Insets(n,n,n,n)
上、左、下、右(各パラメータは表示領域とセルの一方の端の間隔をピクセル数で表します)。
デフォルトの値
insets = new Insets(0,0,0,0)
Javaビジュアル・エディタでのinset値の設定
Javaビジュアル・エディタでは、選択したGridBagLayoutコンポーネント上に、insetsの位置とサイズを示す青いサイズ変更ニブが表示されます。青いニブ(サイズ変更ハンドル)をマウスで選択してドラッグし、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の範囲の数値で指定します。ゼロは、コンポーネントにはスペースを設定できないことを示し、 1.0は、コンポーネントがスペースを完全に共有することを示します。有効な値
weightx=n.n
、weighty=n.n
デフォルトの値
weightx=0.0
、weighty=0.0
Javaビジュアル・エディタでのweightxおよびweighty制約の設定
Javaビジュアル・エディタでコンポーネントのweight制約を指定するには、コンポーネントを右クリックして「水平方向のスペース配分」(weightx)または「垂直方向のスペース配分」(weighty)を選択します。これにより、値が1.0に設定されます。weightを削除(0に設定)するには、コンポーネントを右クリックして「スペース配分の削除」を選択します。この操作を複数のコンポーネントに対して実行できます。[Shift]キーを押しながら各コンポーネントを選択し、右クリックして適切なメニュー項目を選択します。
weight制約を0.0または1.0以外の値に設定する場合は、「制約エディタ」で値を設定できます。
「constraints」
プロパティをクリックして「制約エディタ」を表示します。weight制約がコンポーネントの動作に及ぼす影響の例
この様子を次の図に示します。
最初の例では、 GridBagLayoutパネルの全コンポーネントについてweight制約が値0に設定されています。この制約のため、コンポーネントはGridBagLayoutパネルの中央に集まっており、パネル上の余分なスペースはすべてグリッドの外枠とパネルの間に配分されています。グリッドのサイズは、コンポーネントの優先サイズとinsetsおよび余白(ipadxまたはipady)の合計により決定されます。
次の例では、ListControlの水平方向のweight制約に値1.0が指定されています。1つでもweightの割り当てられているコンポーネントがあると、UI設計がパネルの中央に集まらなくなることがわかります。水平方向のweightが使用されているため、GridBagLayoutマネージャにより、パネル内で以前はグリッドの両側にあった余分なスペースがListControlを含むセルに配分されます。また、ListControlのサイズが変化していないこともわかります。
ヒント: コンポーネントにweightを追加した後もセル内に必要以上のスペースが残る場合は、余分なスペースの大きさが適正になるまでUIのframeのサイズを小さくしてください。フレームのサイズを小さくするには、Javaビジュアル・エディタでframeを選択するか、「構造」ウィンドウでthis(BorderLayout)を選択し、黒のサイズ変更ニブをクリックして、frameを必要なサイズになるまでドラッグします。
最後に、ListControlに水平方向のfillを追加すると、コンポーネントが拡張され、セルの新しい水平方向のディメンションに収まるように最大サイズ化されます。
GridBagLayoutと GridBagConstraintsの詳細は、J2SE(Java 2、Standard Edition)のドキュメントの「GridBagLayout」および「GridBagConstraints」を参照してください。
Copyright © 1997, 2006, Oracle. All rights reserved.