GUI部品の組み合わせ


JavaのAWTには, など,1つのウィンドウで組み合わせて使うための様々な部品が用意されてい る.試しに,なんでもかんでも部品を入れたウィンドウを表示するプログラム を書いてみる.
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の標準的なレイアウト用のクラスとしては,

がある.先ほどのプログラムを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,2,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);
  }
}
のようになる.

なお,GUITest では,ユーザがtwmなどのウィンドウマ ネージャを使って,サイズを変更すると見栄えが悪くなるという欠点があった. これに対処するには, Frame クラスの setResizableメソッドを使って,サイズ変更不能にする 方法があるが,このプログラムでは,paintメソッドの中の,

    g.fillRect(0,0,500,500);
    Dimension d=getSize();
    g.fillRect(0,0,d.width,d.height);
と変更することで対処している. Dimensionクラス は,幅と高さを一度に扱うために用意されたクラスである.
次へ進む