Swing/GridBagLayout のバックアップの現在との差分(No.14)
TITLE:GridBagLayoutの使用
GridBagLayoutの使用
編集者:Terai Atsuhiro~
作成日:2003-09-25
更新日:2021-10-12 (火) 10:34:36
概要
GridBagLayout
を使用して、左右の部品のサイズを固定、中央だけは水平方向に伸縮可になるよう配置します。
Screenshot
Advertisement
概要
例えば、それぞれデフォルトの高さが違うコンポーネントを、BorderLayoutを使って、WEST、CENTER、EASTに配置すると、一番高いコンポーネントに揃えられてしまいます。以下のスクリーンショットではすこし微妙ですが、CENTERのJComboBoxが、EASTのJButtonの高さに揃えられています。サンプルコード
#spanend
#spanadd
public JPanel createPanel(JComponent cmp, JButton btn, String str) {
#spanend
GridBagConstraints c = new GridBagConstraints();
JPanel panel = new JPanel(new GridBagLayout());
#spandel
#screenshot
#spanend
c.gridheight = 1;
c.gridwidth = 1;
c.gridy = 0;
#spandel
GridBagLayoutを使えば、左右のコンポーネントのサイズはBorderLayoutのように固定して、中央のコンポーネントだけを水平方向にのみ伸縮させるといったような、こまかな設定をすることができます。
#spanend
c.gridx = 0;
c.weightx = 0.0;
c.insets = new Insets(5, 5, 5, 0);
c.anchor = GridBagConstraints.WEST;
panel.add(new JLabel(str), c);
#spandel
**サンプルコード [#zf3f0455]
#spanend
#spandel
#code{{
#spanend
public class PanelFactory{
public JPanel createPanel(JComponent cmp, JButton btn, String str) {
GridBagConstraints c = new GridBagConstraints();
JPanel panel = new JPanel(new GridBagLayout());
c.gridheight = 1;
c.gridwidth = 1;
c.gridy = 0;
c.gridx = 0;
c.weightx = 0.0;
c.insets = new Insets(5, 5, 5, 0);
c.anchor = GridBagConstraints.WEST;
panel.add(new JLabel(str), c);
c.gridx = 1;
c.weightx = 1.0;
c.insets = new Insets(5, 5, 5, 0);
c.fill = GridBagConstraints.HORIZONTAL;
panel.add(cmp, c);
c.gridx = 2;
c.weightx = 0.0;
c.insets = new Insets(5, 5, 5, 5);
c.anchor = GridBagConstraints.WEST;
panel.add(btn, c);
return panel;
}
}
c.gridx = 1;
c.weightx = 1.0;
// c.insets = new Insets(5, 5, 5, 0);
c.fill = GridBagConstraints.HORIZONTAL;
panel.add(cmp, c);
#spanadd
#spanend
c.gridx = 2;
c.weightx = 0.0;
c.insets = new Insets(5, 5, 5, 5);
c.anchor = GridBagConstraints.WEST;
panel.add(btn, c);
#spanadd
#spanend
return panel;
#spanadd
}
#spanend
View in GitHub: Java, Kotlin- &jnlp;
- &jar;
- &zip;
解説
上記のサンプルでは、weightxの設定がポイントになっています。これを指定することで、余分のスペースが各列のウェイトに比例して分配されます。ウェイトが0の場合、余分のスペースはその列に分配されません。解説
上記のサンプルでは、GridBagLayout
でBorderLayout
のような配置を行っています。GridBagLayout
の場合、各コンポーネント自身が推奨する高さが生かされるように設定します。
左右の列のweightxが0.0なので、中央の列のweightxは、0.001でも100.0でも水平方向の余分なスペースすべてが配分されます。
-
BorderLayout
- それぞれデフォルトの高さ(推奨サイズ)が異なるコンポーネントを
BorderLayout
を使用してWEST
、CENTER
、EAST
に配置すると一番高いコンポーネントまで拡大 -
CENTER
のJComboBox
がEAST
のJButton
の高さになっている(以下のスクリーンショット参照) -
MotifLookAndFeel
の場合
- それぞれデフォルトの高さ(推奨サイズ)が異なるコンポーネントを
-
GridBagLayout
- 左右のコンポーネントのサイズは
BorderLayout
のように固定して中央のコンポーネントだけを水平方向にのみ伸縮 -
weightx
を指定することで余分のスペースを各列のウェイトに比例して分配 - ウェイトが
0
の場合余分のスペースはその列に分配されない - 左右の列の
weightx
が0.0
なので中央の列のweightx
は0.001
でも100.0
でも水平方向の余分なスペースすべてが配分されている - 垂直方向のスペースは指定していないためデフォルト値の
weighty=0.0
となり、フレームのサイズを変更しても垂直方向に関しては常にコンポーネントの推奨サイズで固定
- 左右のコンポーネントのサイズは
参考リンク
参考リンク
- GridBagLayout (Java Platform SE 8)
-
GridBagの使い方1- 「紙などにマス目で下書きをしてからコンポーネントのレイアウトを設計する」ことで複雑な
GridBagLayout
を設計しやすくする方法が紹介されていた
- 「紙などにマス目で下書きをしてからコンポーネントのレイアウトを設計する」ことで複雑な
- GridBagLayoutでコンポーネントがつぶれるのを防ぎたいとき~
- GroupLayoutの使用