Swing の FlowLayout
前述のように、ボタンなどのコンポーネントはコンテナの中に配置されます。
そして、コンテナ内でコンポーネントのサイズや位置を決めるのは、レイアウトマネージャ (Layout Manager) です。
それぞれのコンテナは既定のレイアウトマネージャを持っていますが、通常は明示的にレイアウトマネージャを指定してユーザーインターフェイスを構築します。
まずは、レイアウトマネージャーを指定しない場合をみてみましょう。
次のプログラムでは JFrame をコンテナとして、"Button 1"、"Button 2"、・・・、"Button 20" というラベルを持つボタンを 20 個追加します。
package com.keicode.java.testapp;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class FLTestJFrame extends JFrame {
public FLTestJFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(350, 200);
for(int i=0; i<20; i++) {
add(new JButton("Button " + (i+1)));
}
setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new FLTestJFrame();
}
});
}
}
これを実行すると、次のようなウィンドウが表示されました。
なんと、最後にコンテナに追加した "Button 20" だけがフレームいっぱいに表示されています。
人間なら、ちょっと考えれば、これがやりたいことではないだろうことは容易に想像つくところですが、 ま、仕方がないですね。
ともあれ、レイアウトマネージャをちゃんと指定しなかった場合には、こんなことになります。
FlowLayout を設定する
そこでフローレイアウト (FlowLayout) というレイアウトマネージャーを指定してみましょう。
フローは「流れる」という意味であることから想像つくように、流れるように順序良く並べる、というのがフローレイアウトです。 エディターで文字を書いたように並べるイメージです。
...
public FLTestJFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(350, 200);
setLayout(new FlowLayout());
for(int i=0; i<20; i++) {
add(new JButton("Button " + (i+1)));
}
setVisible(true);
}
...
変更点は1行のみです。setLayout メソッドに FlowLayout のインスタンスを渡しただけです。
この変更によって、次のように表示されました。
ウィンドウをリサイズすると、ボタンの並びも変わります。文字が折り返すのと同様です。
このように、コンポーネントの位置やサイズを制御するのがレイアウトマネージャーで、 文字のように折り返すような並びとするのが FlowLayout です。
尚、スクリーンショットからわかるように、コンテナの中央に並ぶようにボタンが配置されていますが、 もし左寄せしたいなら、次のように FlowLayout のコンストラクタに FlowLayout.LEFT を渡します。
setLayout(new FlowLayout(FlowLayout.LEFT));
実行した様子は次のようになります。
確かに左に寄っていますね。