Deep Side of Java〜Java 言語再入門 第4回 〜 アプレット、スレッド、AWT

AWTの使い方

Component クラスのメソッドと描画の流れ






AWTの使い方

Component クラスのメソッドと描画の流れ

Component クラスはメニュー関連のクラス以外のすべてのWidgetクラスの抽象基底クラスになっている。だからとりあえずこのクラスで定義されているメソッドを見ておくことが有益だろう。これらは派生クラスで使うために定義されている。

Font getFont(), void setFont( Font f )
このWidgetを描くのに使うフォントを取得/セットする。このセットされたフォントを、以降は Graphics オブジェクトが利用して文字を描く。
Color getForeground(), void setForeground( Color c )
このWidgetを描くのに使う前景色を取得/セットする。
Graphics getGraphics()
Graphics クラスは、「画面描画」の概念を抽象化した、GCを表すオブジェクトである。つまり、各Widgetから取得可能であるが、新規にインスタンス化することはできない。そして、さまざまな描画のためのメソッドを持っている。
void setVisible(boolean b)
表示/非表示を切り替える。
void setEnabled(boolean b)
Widgetの有効/無効を切り替える。いわゆる「灰色になっているオブジェクトは今使えない...」という効果の元である。
Dimension getSize(),void setSize(int w, int h)
Widgetのサイズを取得し、設定する。Dimension クラスはサイズを表す int width, int height だけを持つクラスである。

画面描画に関する処理の流れとそれに関わるメソッドは、この Component クラスで定義されているが、かなり複雑で判りにくい。なぜなら、このWidget描画は直接そのWidgetが描画するのではなく、全体の描画を一元的に管理する別なスレッドによって行われる。だから、「描画をする」ということは、別スレッドに「近々描画をして下さい」とお願いをするということと同じなのである。流れを整理してみよう。

  1. GUIを管理するスレッドが、あるウィンドウに関して再描画の必要性があると認めると、そのウィンドウのトップレベルウィンドウ(Frame クラス)の void repaint() メソッドを呼び出す。勿論、再描画をプログラムから強制したいときに、相当するWidgetに関して、これを明示的呼び出しても良い。
  2. repaint() メソッドの動作は、単に実際に描画を行うスレッドのスケジューリングを強制するに過ぎない。だから、repaint() メソッドは明示的に呼び出されることはあっても、上書きすることは珍しい。
  3. そうすると適切なスケジュールの元に、非同期に別スレッドの void update( Graphics g) メソッドが呼び出される。この update メソッドの任務は、現在のWidgetを背景色で塗りつぶしてから、paint メソッドを呼び出すことである。だから、背景塗りつぶしが不要であれば、この update メソッドを再定義して背景塗りつぶしをキャンセルすることが多い。しかし update メソッドは明示的に呼び出されることはない。
  4. では paint メソッドの任務は何かと言えば、これを上書きして実際の描画処理を追加することである。また、Container クラスなど子Widgetを持つクラスでは、この paint メソッドの中で子Widgetの paint メソッドが呼び出されていく。それゆえ、普通によく上書きをする。

よくアニメーション表示を最適化する目的で、この update メソッドは派生クラスで上書きされる。これらの技によって複雑なアニメーションでのチラツキを抑えることができる。

ダブルバッファリング
作成するイメージを実表示面以外に保持しておく。内部で新しい表示イメージを作成するときに、直接実表示面に描くのではなくて、その内部で保持されたイメージに描画する。そして、その保持されたイメージを実表示面に表示するのは paint() メソッドだが、update メソッドで背景色で塗りつぶす必要がない。また、paint() メソッドでは、そのクラスが管理するオブジェクトに描画を実画面にさせるフリをして、実は保持されたイメージに描画させ、paint メソッドが戻って来たら保持されたイメージによって画面全体を再描画する。

クリッピング
変更がある部分が表示面の一部分だけの場合、その変更がある部分を記録しておいて、実際に再描画が行われる範囲を制限するという技である。再描画範囲が狭くなるので、アニメのチラツキなどを抑えることができる。この場合には update メソッドで実際に描かれる範囲を狭めておいて、paint メソッドでそのクラスが管理するサブクラスの paint を呼び出して行く。そうすると、paint メソッドではクリッピングを意識せずに描画していくことができる。よくダブルバッファリングと併用される。



copyright by K.Sugiura, 1996-2006