固定サイズ領域と可変サイズ領域をBorderLayoutで実現
GUI(グラフィックユーザインタフェース)を作る際に、
悩ましいのがコンポーネントの配置、すなわち
ボタンや文字枠などのレイアウトをどうするか、です。
毎度、管理人イガジーです。
レイアウトマネージャというものを調べてみると、
BorderLayout(4辺+中央配置)、GridLayout(格子状というかタイル的配置)、
FlowLayout(詰め込み式?)くらいですから思うような配置には全く使えない
と感じると思います。でも、多少は工夫の余地があるのです。
レイアウトマネージャを使わずに、setBounds()で座標を指定するのも
ひとつの手ですが、窓(Frame)全体のサイズを変えた時に追随できません。
ラベル:[文字入力エリア=TextField][ボタン]
という様な配置で、文字入力エリアを可変サイズ(=Frameの大きさに
連動するよう)にしたいという場合は、BorderLayoutが使えます。
BorderLayout.CENTER は、全体のサイズに応じて大きさが変わります。
BorderLayout.WEST,BorderLayout.EASTなどは、addしたコンポーネントの
横幅サイズ(固定)となり、全体サイズの影響を受けません。
例として、
ラベル:[文字入力エリア=TextField][ボタン]
ラベル:[文字入力エリア=TextField ]
[OK][Cancel]
という感じで3行の配置をおこなってみましょう。
3行にするのは、GridLayoutを使います。
その(GridLayoutの)中にBorderLayoutを入れ子にするのです。
(一番下のボタン2つは、FlowLayoutにします)
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class GridplusBorder {
TextField tf1,tf2;
Button b1,b2,b3;
GridplusBorder(){
Frame f=new Frame();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
f.setLayout(new GridLayout(3,1));
Panel p1=new Panel();p1.setLayout(new BorderLayout());
Panel p2=new Panel();p2.setLayout(new BorderLayout());
Panel p3=new Panel();
tf1=new TextField(10);b1=new Button("Refer");
tf2=new TextField(10);
b2=new Button("OK"); b3=new Button("Cancel");
p1.add(new Label("Line1:"),BorderLayout.WEST);
p1.add(tf1,BorderLayout.CENTER);
p1.add(b1,BorderLayout.EAST);
p2.add(new Label("Line2:"),BorderLayout.WEST);
p2.add(tf2,BorderLayout.CENTER);
p3.add(b2);p3.add(b3);
f.add(p1); f.add(p2); f.add(p3);
f.setSize(300,130);
f.setVisible(true);
}
public static void main(String[] args) {
new GridplusBorder();
}
}
格好良いとは言えませんが、全体(Frame)のサイズを変えた時に
TextFieldが追随するのを体験してください。
※ 上記のサンプルソースは、処理が入っていないハリボテで
ボタンを押しても何の動作もしません。
この記事へのコメントはこちら