<更新記録>
2008年 3月 30日
執筆

姉妹サイト検索 Web検索


SWTプログラムの基本構造

SWTプログラムの基本構造

グラフィカルアプリケーションは、どのような言語やツールで、どのようなアプリケーションを作成するにせよ、 基本的には大きく分けて

  • ウィンドウを作成
  • メッセージループ
  • 終了
のような構造となります。

メッセージループとは、 ユーザが行った操作をアプリケーション側でメッセージとして受け取りながら処理を行うことを言います。

HelloSWTプログラム

まずは基本構造のみ実装したプログラムを作成してみます。


import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class CreateWindowDemonstrate {
	public static void main(String[] args) {
		// (1)
		Display display = new Display();
		// (2)
		Shell shell = new Shell(display);
		// (3)
		shell.setSize(100, 100);
		// (4)
		shell.open();
		
		// (5)
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		
		// (6)
		display.dispose();
	}
}

GUIプログラムの基本構造に当てはめると、
  • (1),(2),(3),(4)がウィンドウを作成
  • (5)がメッセージループ
  • (6)が終了
となります。 このプログラムの細部について見ていきます。

(1)では、まず、 Display クラスのインスタンスを作成しています。 このDisplayクラスは、OS上のリソース管理を一元して引き受ける役割があります。 1つのSWTプログラムには、1つのDisplayインスタンスを作成します。

(2)では、Shellインスタンスを作成しています。 Shellクラスのコンストラクタの引数には、DisplayクラスまたはShellクラスのインスタンスを指定することができます。 このShellクラスは、プログラムのトップレベルウィンドウを表します。 ということで、ここで行っている操作(Shellインスタンスの作成)は、「 トップレベルウィンドウを作成するためにShellインスタンスを作成した。 そのShellインスタンスは、引数で指定されたDisplayインスタンスによってシステムリソースの管理がされている。 」というようになります。

(3)では、ウィンドウのサイズを設定しています。

(4)Shellインスタンスを作成してそのサイズを決定しただけウィンドウが作成される訳ではありません。 実質的にウィンドウを作成して表示するためには、明示的にShell#open()メソッドで作成・表示を行う必要があります。

(5)の処理は、メッセージループを行っています。

まず、shell.isDisposed()メソッドでは、 ウィンドウが閉じられたかどうかを取得します。 この戻り値がtrueなら閉じられていて、falseならばまだ存在します。 つまり、ウィンドウが開いている限り、whileループを続けるという命令になります。

display.readAndDispatch()の部分では、OS上からイベントメッセージを取得して、 それを処理し、trueを返します。 その際、OS上に、何もメッセージが存在しなかった場合にはfalseを返します。

display.sleep()は、何も処理すべきメッセージが存在しなかった場合に、メッセージが送られてくるまで待機します。 メッセージが送られてきた時に、このメソッドの処理が終了し、再びメッセージループが繰り返されます。

(5)の処理を要約すると、

  • ウィンドウが閉じられていない間ループする
  • メッセージを処理する
  • メッセージが存在しなかったら、メッセージが送られてくるまで停止する
となります。 もしも(5)の処理を記述しなかった場合、プログラムを実行しても、何も起こりません (実際には、ウィンドウがオープンされた直後にループをせずにすぐに終了しているため、 何も起こらなかったように見えます)。

(6)の処理のdisplay.dispose()は、 Displayインスタンスが一元的に管理していたシステムリソースを開放させる処理です。 これは、ストリームやソケットのクローズ命令と同じようなものです。 これを怠ると、 リソース・リーク(OSが使うことのできるリソースの枯渇)が発生することがあるので、必ずdisplay.dispose()を忘れないようにします。


Powered by VeryEasyCMS