<更新記録>
2007年 11月 22日
作成

VeryEasyCMS
このサイトは
このCMSで管理されています

ゴルフアイテム研究所

きままにインデックス

Shell

Shell

Shellクラスは、ウィンドウを表現します。 それは、ウィンドウであったり、ダイアログであったりします。 SWTにおいてGUIプログラミングをするときは、常ににShellインスタンスを作成する必要があります。

最もシンプルなSWTのGUIプログラミングのコードを示します。
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();
	}
}
それぞれの処理が行っている内容を説明します。

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

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

(3)では、(4)の処理で作成されるウィンドウのサイズを設定しています。 ここで設定する値を変更することで、表示されるウィンドウのサイズが変わります。

(5)の処理は、最も難しい部分です。 この部分は、メッセージループの処理についてされた記述です。

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

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

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

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

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

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


Powered by VeryEasyCMS