appendix> Layout> GridBagLayout | TOPUPPREVNEXT |
グリッドレイアウトのように格子状に配置するのですが、列の幅や、行の高さ、 などを個別に指定できます。 格子状の配置場所となるコンポーネントのレイアウトに GridBagLayout を指定しておき、 配置するコンポーネントに対して、 GridBagConstraints をつかって、 格子のどこから何マス使って配置するか、 列の幅をどうするか、行の高さをどうするか、 外枠の大きさが広がった場合に自分の大きさも広げるのか、 外枠が小さくなった場合にいいなりにちじんでしまうのか、 などを指定します。
指定する項目が多く煩雑ですが、 それぞれのフィールドの意味や働きは単純です。 かなり自由なレイアウトがができるようになります。 例題1、2のように グリッドと配置をきめ、拡大しない状態で一旦 fill を調整し、 拡大した状態で weight を調整し、weight がゼロの行や列にあるコンポーネントの anchor を調整し、 最後に insets を調整するという手順ですすめると簡単に設定できます。
java.lang.Object
├java.awt.GridBagLayout
├java.awt.GridBagConstraints
└java.awt.Insets
コンストラクタ | 機能 | ||||||||
---|---|---|---|---|---|---|---|---|---|
GridBagLayout ( ) | グリッドバグレイアウトマネージャを生成します。 生成したものを、受取側のコンポーネントに setLayout します。 | ||||||||
GridBagConstraints ( ) | デフォルト値をフィールドに指定した配置規則を生成します。
生成した後、必要なフィールドを設定してから、
配置するものに対して setConstraints
メソッドで設定をしてから add を行うか、または、
add する際のパラメータに指定します。 11個のパラメータをぶらさげて 全フィールドを設定するコンストラクタもありますが、推奨されていません。 | ||||||||
Insets ( int top ,
int left , int bottom , int right ) |
「外部パディング」に使用するインセットを生成します。
|
フィールド | 値 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
int grigx int gridy |
配置する場所の列、行を指定します。配置するものが複数の列や行にまたがる場合は、
左上隅の位置を指定します。 原点(左上隅)は gridx が 0 、 gridy が 0 です。 gridx = 1 はその右、 gridy = 1 はその下になります。
| ||||||||||||||||||||
int gridwidth int gridheight |
配置するものが、何列あるいは何行を占めるかを指定します。 行の最後までを占有する場合には、、 gridwidth に GridBagConstraints.REMAINDER を設定します。 行の右側のあいている部分を占有するには、 gridwidth に GridBagConstraints.RELATIVE を設定します。 列の最後までを占有する場合には、 gridheight に GridBagConstraints.REMAINDER を設定します。 列の下側のあいている部分を占有するには、 gridheight に GridBagConstraints.RELATIVE を設定します。 | ||||||||||||||||||||
double weightx | 外側が横方向に広がった場合、配置した場所の横幅を、
ほかの部分の横幅とくらべて、多めに広げるか少なめに広げるかを指定します。
weight の値自体ではなく、他の列の要素に指定された weightx
との比率で決定されます。 横方向の全て指定がゼロの場合には、左右があいて中央付近に配置されます。 | ||||||||||||||||||||
double weighty | 外側が縦方向に広がった場合、配置した場所の高さが、
ほかの行の高さとくらべて、多めに広がるのか少なめに広がるかを指定します。
他の行に指定された weighty との比率で決定されます。 縦方向の全ての指定がゼロの場合、上下があいて中央付近に配置されます。 | ||||||||||||||||||||
int anchor | 貼り付けるマスが自分自身より大きい場合に、マスのどの辺に配置するかを
次のいずれかで指定します。
| ||||||||||||||||||||
int fill | 貼り付けるマスが自分自身がより大きい場合に、
自分自身をどのように広げるかを次のいずれかで指定します。
NONE ―― 大きさを変えない
BOTH ―― 縦、横いっぱいに広げる HORIZONTAL ―― 横方向のみ広げる VERTICAL ―― 縦方向にのみ広げる | ||||||||||||||||||||
int ipadx int ipady |
「内部パディング」。 自分自身の最小サイズよりも、横に ipadx の2倍 、 縦に ipady の2倍だけ大きく表示されます。 | ||||||||||||||||||||
Insets insets | 「外部パディング」。 自分自身とマスの枠の間にあけるべき間隔を指定します。 |
メソッド | 機能 |
---|---|
void setConstraints (
Component comp , GridBagConstraints constraints ) |
GridBagLayout クラスのメソッドです。 constraints に指定された配置規則を、 comp に設定します。 |
void add (
Component comp , Object constraints ) |
Container クラスのメソッドです。 comp に指定されたコンポーネントを、 このコンテナの最後に追加します。 constraints に指定されたコンポーネントの配置規則は レイアウトマネージャが使用します。 |
gridx、 gridy、 gridwidth、gridheight の使用例です。 REMAINDER や RELATIVE の働きを理解しましょう。 たとえば、下図のようにコンポーネントを配置する場合を考えましょう。。 No.2 〜 No.4 は現在は3個ですが、 将来4個横に並べるような改造が予定されているとします。
プログラム LayoutSampleGridBagLayout4.java
実行結果
この状態で各コンポーネントは割り当てられた領域の中央に配置されています。 配置の状況が判るように、コンポーネントを配置されている領域全体に広げてみましょう。
プログラム LayoutSampleGridBagLayout4a.java
実行結果
全コンポーネントが領域いっぱいに広がります。 ここでウィンドウを広げてみましょう。
実行結果
パネルは、広がったフレームの中央に配置されています。 フレームの拡大・縮小に追随するようにするには、 weightx と weighty をゼロ以外に設定する必要があります。
プログラム LayoutSampleGridBagLayout4b.java
実行結果
全コンポーネントのweightx と weighty が 100.0 になっている状態です。どの欄もおなじ比率で拡大されます。
さて、ここで No.4 の右側にコンポーネントを追加してみましょう。
プログラム LayoutSampleGridBagLayout4c.java
実行結果
No.5 の gridx や No.6 〜 No.7 の gridheight に、RELATIVE と指定してあったので配置規則を変更せずにコンポーネントを追加することができました。
具体的なコンポーネントの例をみてみましょう。 20.2 ハノイの塔 の画面の下 ( BorderLayout の SOUTH )に貼り付けられた、 ラベルや、テキスト・フィールド、スライダ、ボタン などが配置されたパネルのコーディングをのぞいてみましょう。 パネルの概観は次のようなものです。
レイアウトの設計をするために描いたグリッドは下図のとおりです。 ウィンドウが広げられた場合、1列目と6列目が主に広がり、 4列目が遠慮がちに広がるようにしたいと思います。 BorderLayout の SOUTH 用のパネルですから、縦に広げられることは想定していません。
Hanoi.java から関連する部分を抜き出して、 デフォルトの配置規則で表示してみました。
プログラム LayoutSampleGridBagLayout2.java
実行結果
FlowLayout のように左から右へ配置されます。
gridx、 gridy、 gridwidth、gridheight を指定しましょう。
プログラム LayoutSampleGridBagLayout2a.java
実行結果
"go" ボタン と "stop" ボタンの大きさをそろえるために、 fill を設定しましょう。 "quick" ラベルと "slow" ラベルの配置を調整するために、 anchor を設定しましょう。
プログラム LayoutSampleGridBagLayout2b.java
実行結果
両端が狭いのが気になります。 また、ウィンドウを広げてみると weightx の設定が必要なことが判ります。(下図)
glue1 と glue3 の weightx に 100.0 を、 glue2 には 50.0 を設定してみましょう。 両端がウィンドウの枠にくっつき過ぎないよう、"number of disk" や "move count" など両端のコンポーネントにインセットを指定します。
プログラム LayoutSampleGridBagLayout2c.java
実行結果
ウィンドウ広げてみましょう。
完成です。縦方向には伸びないことも確認できました。
更新日:2004-11-01