• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:GridBagLayoutの使用
#navi(../)
#tags(GridBagLayout, LayoutManager)
RIGHT:Posted by &author(aterai); at 2003-09-15
*GridBagLayoutの使用 [#b98b0be6]
``GridBagLayout``を使用して、左右の部品のサイズを固定、中央だけは水平方向に伸縮可になるよう配置します。
---
category: swing
folder: GridBagLayout
title: GridBagLayoutの使用
tags: [GridBagLayout, LayoutManager]
author: aterai
pubdate: 2003-09-15
description: GridBagLayoutを使用して、左右の部品のサイズを固定、中央だけは水平方向に伸縮可になるよう配置します。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTNi4XckaI/AAAAAAAAAa8/8VJwvf6EScw/s800/GridBagLayout.png
---
* 概要 [#summary]
`GridBagLayout`を使用して、左右の部品のサイズを固定、中央だけは水平方向に伸縮可になるよう配置します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTNi4XckaI/AAAAAAAAAa8/8VJwvf6EScw/s800/GridBagLayout.png)

//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTNi4XckaI/AAAAAAAAAa8/8VJwvf6EScw/s800/GridBagLayout.png)

**サンプルコード [#zf3f0455]
* サンプルコード [#sourcecode]
#code(link){{
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.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;
}
}}

**解説 [#y3ee5273]
上記のサンプルでは、``GridBagLayout``で``BorderLayout``のような配置を行っています。ただし、``GridBagLayout``の場合は、各コンポーネントが推奨する高さが生かされるように設定しています。
* 解説 [#explanation]
上記のサンプルでは、`GridBagLayout`で`BorderLayout`のような配置を行っています。`GridBagLayout`の場合、各コンポーネント自身が推奨する高さが生かされるように設定します。

- ``BorderLayout``
-- それぞれデフォルトの高さが違うコンポーネントを、``BorderLayout``を使って、``WEST``、``CENTER``、``EAST``に配置すると、一番高いコンポーネントに揃えられる。
-- ``CENTER``の``JComboBox``が、``EAST``の``JButton``の高さになっている(スクリーンショット参照)。
-- ``MotifLookAndFeel``の場合
- `BorderLayout`
-- それぞれデフォルトの高さ(推奨サイズ)が異なるコンポーネントを`BorderLayout`を使用して`WEST`、`CENTER`、`EAST`に配置すると一番高いコンポーネントまで拡大
-- `CENTER`の`JComboBox`が`EAST`の`JButton`の高さになっている(以下のスクリーンショット参照)
-- `MotifLookAndFeel`の場合

#ref(http://lh6.ggpht.com/_9Z4BYR88imo/TQTNldPsABI/AAAAAAAAAbA/eep6P-D2eC8/s800/GridBagLayout1.png)
#ref(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTNldPsABI/AAAAAAAAAbA/eep6P-D2eC8/s800/GridBagLayout1.png)

- ``GridBagLayout``
-- 左右のコンポーネントのサイズは``BorderLayout``のように固定して、中央のコンポーネントだけを水平方向にのみ伸縮させる。
-- ``weightx``を指定することで、余分のスペースを各列のウェイトに比例して分配している。
-- ウェイトが``0``の場合、余分のスペースはその列に分配されない。
-- 左右の列の``weightx``が``0.0``なので、中央の列の``weightx``は、``0.001``でも``100.0``でも水平方向の余分なスペースすべてが配分されている。
-- 垂直方向のスペースは指定していないため、デフォルト値の``weighty=0.0``となり、フレームのサイズを変更しても、垂直方向に関しては常にコンポーネントの推奨サイズで固定される。
- `GridBagLayout`
-- 左右のコンポーネントのサイズは`BorderLayout`のように固定して中央のコンポーネントだけを水平方向にのみ伸縮
-- `weightx`を指定することで余分のスペースを各列のウェイトに比例して分配
-- ウェイトが`0`の場合余分のスペースはその列に分配されない
-- 左右の列の`weightx`が`0.0`なので中央の列の`weightx`は`0.001`でも`100.0`でも水平方向の余分なスペースすべてが配分されている
-- 垂直方向のスペースは指定していないためデフォルト値の`weighty=0.0`となり、フレームのサイズを変更しても垂直方向に関しては常にコンポーネントの推奨サイズで固定

``IDE``などのサポート無しでは、すこし面倒な``GridBagLayout``ですが、[http://homepage1.nifty.com/masada/cyber/javagridbag1.htm GridBagの使い方1]の「紙などにマス目で下書きをしてから、コンポーネントのレイアウトを設計する」方法を使えば、凝ったレイアウトでも理解しやすく、すっきり設計できます。
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/java/awt/GridBagLayout.html GridBagLayout (Java Platform SE 8)]
- %%[http://homepage1.nifty.com/masada/cyber/javagridbag1.htm GridBagの使い方1]%%
-- 「紙などにマス目で下書きをしてからコンポーネントのレイアウトを設計する」ことで複雑な`GridBagLayout`を設計しやすくする方法が紹介されていた
- [http://satoshi.kinokuni.org/tech/SwingTipsLayout.html#section1 GridBagLayoutでコンポーネントがつぶれるのを防ぎたいとき~]
- [[GroupLayoutの使用>Swing/GroupLayout]]

**参考リンク [#w19d9442]
-[http://homepage1.nifty.com/masada/cyber/javagridbag1.htm GridBagの使い方1]
-[http://satoshi.kinokuni.org/tech/SwingTipsLayout.html#section1 GridBagLayoutでコンポーネントがつぶれるのを防ぎたいとき~]
-[[GroupLayoutの使用>Swing/GroupLayout]]

**コメント [#x3c448ad]
* コメント [#comment]
#comment
#comment