GUIアプリケーション


ウィンドウの生成

これまではずっとアプレットによるグラフィカルプログラミングでした
アプレットはブラウザがなければ実行できません

しかし、Javaのグラフィカルプログラミングはアプレットに終わりません
ここではGUIアプリケーションの作成に挑戦したいと思います
すなわち、public static void main()から実行するプログラムです
今までと違い、コンソールからjavaコマンドで(JDK1.2)実行することができるのが魅力的ですね

アプリケーションの場合とアプレットの違いは、アプレットクラスを拡張するかどうかだけです
基本的なグラフィカルプログラミングやコンポーネントの生成、イベントといった
GUIプログラミングに最低限必要な知識はすでにこれまでのアプレットプログラムで十分得ています
あとは、アプレットに変わるウィンドウの生成ができれば、アプリケーションを作れます

ウィンドウコンポーネントはjava.awt.Frameクラスを使用する
このクラスは、Containerクラスを拡張しているjava.awt.Windowクラスのサブクラスです
Windowクラスは、タイトルやメニューバーなどのないからのウィンドウを生成します
Frameクラスは、これにタイトルバーなどのウィンドウに最低限必要な部品をつけたものです
Frameクラスのコンストラクタは次の二つです

public Frame()
public Frame( String title )

titleを指定した場合は、指定した文字列がタイトルバーに表示されます
フレームを生成した時点では、まだフレームは表示されません
フレームの表示はComponentクラスのsetVisible()メソッドで設定します

public void setVisible( boolean b )

bにtrueを指定すると表示、falseを指定するとコンポーネントを非表示にします
ウィンドウ関連のイベントはWindowクラスのaddWindowListener()でリスナを登録できます

public synchronized void addWindowListener( WindowListener lis )

lisにリスナを指定します
ここで指定するリスナはjava.awt.event.WindowListenerインターフェイスです
次のイベントで呼び出されるメソッドが宣言されています

public abstract void windowActivated( WindowEvent e ) - アクティブ時
public abstract void windowClosed( WindowEvent e ) - 解放時
public abstract void windowClosing( WindowEvent e ) - 解放要求時
public abstract void windowDeactivated( WindowEvent e ) - 非アクティブ時
public abstract void windowDeiconified( WindowEvent e ) - 非アイコン時
public abstract void windowIconified( WindowEvent e ) - アイコン時
public abstract void windowOpened( WindowEvent e ) - ウィンドウオープン時

このイベントリスナにはjava.awt.event.WindowAdapterクラスも用意されています
パラメータで受け取るのはjava.awt.event.WindowEventクラスのオブジェクトです
このクラスには、イベント元となったオブジェクトを返すgetWindow()メソッドがあります

public Window getWindow()

イベントの発生源となったオブジェクトを返します

さらに、アプリケーションの場合は終了処理も大切な要素です
ウィンドウを破棄しリソースを解放するには、Windowクラスのdispose()メソッドを呼び出します

public void dispose()

ウィンドウが破棄されると、WindowClosed()が呼び出されます
フレームの終了ボタンが押された場合はWindowClosing()が呼び出されるので
これらのイベントを利用して、アプリケーションの終了処理をします
import java.awt.*;
import java.awt.event.*;

class test extends Frame implements WindowListener{
	public test(String title) {
		super(title);
		addWindowListener(this);
	}
	public static void main(String args[]) {
		test win = new test("Kitty on your lap");
		win.setSize(300 , 300);
		win.setVisible(true);
	}

	public void windowActivated(WindowEvent e) {
		System.out.println("アクティブイベント");
	}
	public void windowClosed(WindowEvent e) {
		System.out.println("ウィンドウクローズイベント");
		System.exit(0);
	}
	public void windowClosing(WindowEvent e) {
		System.out.println("クローズ要求イベント");
		dispose();
	}
	public void windowDeactivated(WindowEvent e) {
		System.out.println("非アクティブイベント");
	}
	public void windowDeiconified(WindowEvent e) {
		System.out.println("非アイコン化イベント");
	}
	public void windowIconified(WindowEvent e) {
		System.out.println("アイコン化イベント");
	}
	public void windowOpened(WindowEvent e) {
		System.out.println("ウィンドウオープンイベント");
	}	
}
長く感じるのは、リスナのメソッドをすべて定義しているからで
main()とコンストラクタは単純な構成になっているのがわかると思います
Javaはこんなにも簡単にGUIアプリケーションが組める言語なのです

アイコン化については、プラットフォームで未対応の場合もあるので注意してください

Frameクラスはアプリケーションだけのものではありません
アプレットでブラウザから独立したウィンドウを作成したいときにも使えます
新しいウィンドウの作り方や、ウィンドウの終了処理の方法はアプリケーションと同じです
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

/*	<applet code="App41.class" width="300"height="300">
 	</applet>
*/

public class App41 extends Applet implements ActionListener {
	Frame frm;
	public void init() {
		setBackground(Color.white);
		Button but = (Button)add(new Button("子猫ちゃんが好き♪"));
		but.addActionListener(this);
	}
	public void actionPerformed(ActionEvent e) {
		if (frm == null) {
			frm = new Frame("Kitty on your lap");
			frm.setSize(200 , 200);
			frm.show();
		}
		else {
			frm.dispose();
			frm = null;
			return;
		}
	}
}
アプレット

ウィンドウを消すにはアプレットのボタンをもう一度押してください
イベント処理をしていないので、フレームの終了ボタンを押しても消えません



前のページへ戻る次のページへ