GUI部品の組み合わせ


JavaのAWTには,
ボタン(Button)
押すことで何かのアクションを起こさせるために用いる.
チェックボックス(CheckBox)
onかoffかという状態を表現する.
ラベル(Label)
文字列(テキスト)をGUI部品とするためのもの.ボタンと違って押せないし,ユーザが直接文字列を編集することもできない.
メニューバー(MenuBar)
Frameに setMenuBarメソッドで関連づけて使う. Menuを階層化して表示することができる.一つのFrameに複数のMenuBarをつけることはできないし,Frame以外のものにつけることもできない.
スクロールバー(Scrollbar)
一般的なスクロールバーのGUI部品.
テキストフィールド(TextField)
1行のテキスト入力をおこなうためのGUI部品.複数行を入力する場合は, TextAreaを使う.日本語入力環境が動作している場合は,日本語も入力することができる.センターの環境では,kinput2(Shift+Spaceで漢字変換モード,Ctrl-Cで変換,Ctrl-Lで確定)で入力できる.
などのGUI部品が含まれている.他にもいろいろ有用な部品が含まれているの で,AWT パッケージのドキュメントを見てまわって,作りたいプログラムに使える 部品があるかどうか探してみると良い.

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は
のように,Containerに部品を左上から順に各行につめられるだけ詰めていって, 最後に各行を中央揃えして表示する(各行の揃え方など細かい点は変更もできる).

先ほどのプログラムを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は
のように,全体を指定した行数,カラムで等分割して,左上から順に部品を詰 めていく.通常の場合,GUI部品のサイズは指定された領域のサイズに変更さ れる.

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

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