本ページでは、Displayクラスについて少々深く理解するための記述を行います。
Displayクラスは、プログラムの始めに何となく作成し、プログラムの終わりに何となく決まり事としてdisposeしていますが、 このクラスが実際に何を行っているのかについて知っておくことは、SWTプログラミングを行う上で重要です。
Displayクラスは、大まかに挙げて、次のような働きをしています。
リソースの確保と管理は、プログラムを実行する上で欠かせない作業となります。 まず、Java VMが実行されると、Java VMのためにメモリがオペレーティングシステムから確保されます。 通常のJavaプログラミングであれば、この時確保されたメモリプールからすべてのメモリをやり繰りします。
しかしSWTを使用する場合、ウィジェットは、Java VM上ではなくオペレーティングシステム上に作成されます。 そして作成したウィジェットが必要とするリソースは、 Java VMからではなく、OSから直接割り当ててもらう必要があります。
例えば、HelloSWTでは、Shellクラスのインスタンスを使用してウィンドウを作成しましたが、 このウィンドウは、Java VM上に作成されたわけではなくその外、つまりOS上に作成されます。 Javaアプリケーション側では、それを操作しているだけなのです。 この場合、作成されたウィンドウが使っているリソースは、OSから直接割り当てられたものになります。
オペレーティングシステムから直接割り当てられたリソースは、Javaプログラムを終了しただけでは開放されることはありません。 そこで、明示的にリソースを開放しなければなりません。 それが、Display#dispose()なのです。
SWTによってウィンドウやその他のウィジェットを作成する場合、まずアプリケーションは どういった処理をOSに依頼するのかを決定します。 例えば、ウィンドウを作成するだとか、ボタンを作成するといった内容です。 これを実際にOSに伝え、実行してもらう事は、Displayクラスが行います。
また、作成されたウィンドウやボタンは、OS上のものなので、 ユーザが行う操作を認識できるのはOSです。 Displayクラスは、OSから、自分のアプリケーションが作成したプログラムにユーザがどのような操作を行ったのかを受け取るという役割も果たします。 それを行うのがDisplay#readAndDispatch()です。
SWTは、もともとある意味他力本願です。 ウィンドウの作成も、画面の描画も、SWTのライブラリは殆どその処理を定義しておらず、 それらをどのようにOSにこなしてもらうかを定義しているだけです。
そんな他力本願的なSWTが、実際にOSに“お願い”する窓口となるのがDisplayクラスです。 Displayクラス無しには、SWTプログラミングは始まりません。