12. Frame

Frame を使うとアプリケーションプログラムからウインドウや GUI が使えるようになります。

(1) Frame の基本的な使い方

 java.awt.Frame クラスは1つのウインドウです。Frame クラスを使えば、今までは文字だけだったアプリケーションプログラムでも GUI を使うことができるようになります。

 Frame オブジェクトは次のどちらかのコンストラクタを使います。
Frame f = new Frame( );
Frame f = new Frame(String title);

 2つ目のコンストラクタを使うとウインドウにタイトルを付けることができます。タイトルは Frame クラスのメソッドで設定することもできます。これで Frame ができますが、その次に大きさを設定しなければいけません。
 Frame の大きさを設定するには Component クラスのメソッドを使います。

setSize(int width, int height)

 Frame が出来たらこれはコンテナの1つですから、今までのアプレットと同じようにレイアウトを設定して、コンポーネントを作成して追加します。

 Frame を作ってコンポーネントを追加したら最後に Frame を表示させます。これも Component クラスのメソッドを使い、

setVisible(boolean visible)

 このメソッドの引数を true にしてフレームを表示します。引数を false にすれば Frame が表示されなくなります。もうその Frame を使わない場合は dispose( ) メソッドで資源を解放します。

  FrameTest.java

// FrameTest.java

import java.awt.*;
import java.awt.event.*;

public class FrameTest implements ActionListener {
    Frame f;
    Button ok,close;
    
    public FrameTest() {
        
        // フレーム作成
        f = new Frame("FrameTest");
        
        // サイズ設定
        f.setSize(200,100);
        
        // レイアウト設定
        f.setLayout(new FlowLayout());
        
        // コンポーネント追加
        ok = new Button("OK");
        close = new Button("Close");
        f.add(ok);
        f.add(close);
        
        // リスナ登録
        close.addActionListener(this);
        
        // フレーム表示
        f.setVisible(true);
    }
    
    public void actionPerformed(ActionEvent e) {
        // Closeボタンが押された時
        if ( e.getSource()==close ) {
            // フレームが使っていた資源を解放
            f.dispose();
            // インタプリタ終了
            System.exit(0);
        }
    }
    
    public static void main(String args[]) {
        FrameTest obj = new FrameTest();
    }
}


 実行方法

C:\java_test>java FrameTest


 実行例



 この例題ではフレームの右上の×ボタンを押してもフレームを閉じることができません。このボタンで閉じるには次で説明する WindowEvent の処理が必要です。


(2) WindowEvent

 ウインドウに関するイベントは WindowEvent で処理をします。WindowEvent を処理するメソッドは WindowListener インタフェースに定義されています。このインタフェースに定義されているメソッドは全部で7つです。上の例のウインドウを閉じるときの処理を書くのは windowClosing( ) になります。


void windowActivated(WindowEvent e)
ウィンドウがアクティブになったとき

void windowClosed(WindowEvent e)
ウィンドウがクローズされたとき

void windowClosing(WindowEvent e)
ウィンドウを閉じようとしたとき

void windowDeactivated(WindowEvent e)
ウィンドウがアクティブではなくなったとき

void windowDeiconified(WindowEvent e)
ウィンドウが最小化された状態から通常の状態に戻ったとき

void windowIconified(WindowEvent e)
ウィンドウが最小化された状態になったとき

void windowOpened(WindowEvent e)
ウィンドウが最初に可視になったとき

 これらはインタフェース内に定義されているメソッドなので、windowClosing( ) 以外は必要ないという場合でも、何も処理をしないようにしてオーバーライドします。

 リスナを登録するメソッドは Frame クラスのスーパークラスの Window クラスのメソッドで

void addWindowListener(WindowListener listner)

 という形式のメソッドです。

  FrameTest2.java

// FrameTest2.java

import java.awt.*;
import java.awt.event.*;

public class FrameTest2 implements WindowListener {
    Frame f;
     
    public FrameTest2() {
        // フレーム作成
        f = new Frame("FrameTest");
        // サイズ設定
        f.setSize(200,100);    
        // リスナ登録
        f.addWindowListener(this);
        // フレーム表示
        f.setVisible(true);
    }

    // ウインドウを閉じるとき
    public void windowClosing(WindowEvent e) { 
        System.exit(0);
    }

    public void windowActivated(WindowEvent e) { }
    public void windowClosed(WindowEvent e) { }
    public void windowDeactivated(WindowEvent e) { }
    public void windowDeiconified(WindowEvent e) { }
    public void windowIconified(WindowEvent e) { }
    public void windowOpened(WindowEvent e) { }
  
    public static void main(String args[]) {
        FrameTest2 obj = new FrameTest2();
    }
}


 実行方法

C:\java_test>java FrameTest2


 実行例 (現在、画像をクリックしても実際のアプレットが起動しません)



 右上の「閉じる」ボタンでウィンドウが閉じられることを確認してください。


(3) Adapter クラス

 WindowEvent を処理する場合、WindowListener 内の7つのメソッドをオーバーライドしなければいけませんが、よく使うのは windowClosing( ) 1つだけということもよくあります。このような場合はすべてのメソッドをオーバーライドするのは面倒です。

 そのために、あらかじめ処理を何もしない状態でオーバーライドしてある WindowAdapter クラスがあります。このクラスのサブクラスを作ると、必要なメソッドだけをオーバーライドすればよくなります。

class MyWindowHandler extends WindowAdapter {
    void windowClosing(WindowEvent e) { ... }
}

class MyFrame {
    MyFrame() {
        Frame f = new Frame();
        
        // リスナ登録
        f.addWindowListener(new MyWindowHandler());
        .
        .
        .
    }
}

 イベント用のインタフェース内のメソッドが多いようなもの(たとえば MouseListener など)にはこのようなアダプタークラスが用意されているものがあります。

前の章(11.Choice / List)   次の章(13.Dialog / FileDialog
)