GridBagLayoutの使用

編集者:Terai Atsuhiro
作成日:2003-09-25
更新日:2021-10-12 (火) 10:34:36

概要

例えば、それぞれデフォルトの高さが違うコンポーネントを、BorderLayoutを使って、WEST、CENTER、EASTに配置すると、一番高いコンポーネントに揃えられてしまいます。以下の図ではすこし微妙ですが、CENTERのJComboBoxが、EASTのJButtonの高さに揃えられています。

http://terai.xrea.jp/swing/gridbaglayout/screenshot.png

GridBagLayoutを使えば、左右のコンポーネントのサイズはBorderLayoutのように固定して、中央のコンポーネントだけを水平方向にのみ伸縮させるといったような、こまかな設定をすることができます。

サンプルコード

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;
  }
}

解説

上記のサンプルでは、weightxの設定がポイントになっています。これを指定することで、余分のスペースが各列のウェイトに比例して分配されます。ウェイトが0の場合、余分のスペースはその列に分配されません。

左右の列のweightxが0.0なので、中央の列のweightxは、0.001でも100.0でも水平方向の余分なスペースすべてが配分されます。

一方、垂直方向のスペースは指定していないため、デフォルト値のweighty=0.0となります。このためフレームのサイズを変更しても、垂直方向に関しては常にコンポーネントの推奨サイズで固定されることになります。

以前は、難しいと言われていたGridBagLayoutですが、IDE(NetBeansやEclipse+VisualEditorなど)を使えば簡単に利用することができるようです。テキストエディタで使用する場合も、GridBagの使い方1の「紙などにマス目で下書きをしてから、コンポーネントのレイアウトを設計する方法」を使えば、凝ったレイアウトでも理解しやすく、すっきり設計できるのではないかと思います。

参考リンク

コメント