グラフィカルアプリケーションは、どのような言語やツールで、どのようなアプリケーションを作成するにせよ、 基本的には大きく分けて
メッセージループとは、 ユーザが行った操作をアプリケーション側でメッセージとして受け取りながら処理を行うことを言います。
まずは基本構造のみ実装したプログラムを作成してみます。

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