AWTの中の ContainerのサブクラスであるGUI部品は内部に他の部品を含むことができ る.すでに出てきたクラスの中では, Frame が該当する(FrameはWindow のサブクラスでWindowはContainerのサブクラス).試しに,なんでもかんでも 部品を入れたFrameを表示するプログラムを書いてみる.
import java.awt.*;
public class GUITest extends Frame {
public static void main(String args[]){
// GUITestクラスのインスタンスを生成
GUITest window=new GUITest();
// window内部に GUI部品を置くときのレイアウトをFlowLayoutに指定
window.setLayout(new FlowLayout());
// 「Button1」というラベルを持つボタンを作り,window中に配置
window.add(new Button("Button1"));
// ラベルを持たないボタンを作り,window中に配置
window.add(new Button());
// 「Check1」というラベルを持つチェックボックスを作り,window中に配置
window.add(new Checkbox("Check1"));
// ラベルを持たないチェックボックスを作り,window中に配置
window.add(new Checkbox());
// スクロールバーを作り,window中に配置
window.add(new Scrollbar());
// 縦方向のスクロールバーを作り,window中に配置
window.add(new Scrollbar(Scrollbar.HORIZONTAL));
// 幅10文字分のTextField(テキスト入力用領域)を作り,window中に配置
window.add(new TextField(10));
// windowのサイズを 500 x 500 に変更
window.setSize(500,500);
// windowを表示する.
window.setVisible(true);
}
public void paint(Graphics g){
// 以後の描画,塗り潰しの色を黄色に指定
g.setColor(Color.yellow);
// (0,0)から幅500,高さ500で描画
g.fillRect(0,0,500,500);
}
}
それぞれの部品は,自律的に動く.JavaのGUIインタフェースはAWT(Abstract
Window Toolkit)というだけあって,抽象的な(Abstract)定義であり,部品が
どのように,見えるかなどの細かい点は定義しない. そのため,同じjavaプロ
グラムも別の処理系で実行してみると見掛けが大きく違う.
また,処理系によって部品の大きさなどが変化する可能性があるため,部品 の配置(レイアウト)なども,X,Y座標の絶対座標で指定するのではなく,抽象 的なレイアウト用のクラスを用いる.awtの標準的なレイアウト用のクラスとしては,
がある.先ほど,使ったFlowLayoutは
先ほどのプログラムをGridLayoutを使うように書き直すと,
import java.awt.*;
public class GUITest1 extends Frame {
public static void main(String args[]){
GUITest1 window=new GUITest1();
// window内部に GUI部品を置くときのレイアウトを
// 3行2カラムで,GUI部品間の水平間隔10ピクセル,垂直間隔10ピクセルの
// GridLayoutに指定.
window.setLayout(new GridLayout(3,3,10,10));
window.add(new Button("Button1"));
window.add(new Button());
window.add(new Checkbox("Check1"));
window.add(new Checkbox());
window.add(new Scrollbar());
window.add(new Scrollbar(Scrollbar.HORIZONTAL));
window.add(new TextField(10));
window.setSize(500,500);
window.setVisible(true);
}
public void paint(Graphics g){
g.setColor(Color.yellow);
// 現在のフレームのサイズを求める
Dimension d=getSize();
// (0,0)から現在のフレームの幅,高さで塗り潰す.
g.fillRect(0,0,d.width,d.height);
}
}
のようになる.GridLayoutは
なお,GUITest では,ユーザがtwmなどのウィンドウマネージャを使って,サ イズを変更すると塗り残しが出て,見栄えが悪くなるという欠点があった.こ れに対処するには, Frame クラスの setResizableメソッドを使って,サイズ変更不能にする 方法があるが,このプログラムでは,paintメソッドの中の,
g.fillRect(0,0,500,500);
を
Dimension d=getSize();
g.fillRect(0,0,d.width,d.height);
と変更することで対処している.
Dimensionクラス は,幅と高さを一度に扱うために用意されたクラスである.