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クラス は,幅と高さを一度に扱うために用意されたクラスである.