2-1-5: グラフィックスと描画処理

ウィンドウシステム上のアプリケーションの描画処理には独自のスタイルがあります。 その仕組みと、JDK のコンポーネントの描画処理の方法について解説します。


・ ウィンドウ上のアプリケーションの場合、 描画処理が呼び出されるタイミングはユーザーの操作に依存します。 たとえば、一時的に他のウィンドウに隠された状態や アイコン化された状態から復活した場合など、 予測がつかないタイミングで再描画が必要となるからです。


ウィンドウのプログラムでは絵の復活の処理が必要

上に述べたような状況に対応するために、 以下のような2種類の対応方法が考えられます。

Javaの AWTでは基本的には最初の方の対応方法が取られます。 (第2のスタイルの方がアプリケーションの側の処理は単純にできますが、 すべてのウィンドウシステムでそうした機能が保証できるとは限らないからでしょう。 また、 専用の Canvasオブジェクトを用意して ダブルバッファリングによるリカバ機能を使えば、 事実上は第2の方法を利用することができます。 ただし、あくまでアプリケーションの側の対応です。)
再描画の処理が必要だという通知は、 アプリケーション内の描画を担当するウィンドウのオブジェクトに伝えられます。 java.awt の提供するウィンドウのオブジェクトは、 すべて java.awt.Component と言う名前のクラスのサブクラスです。 以下、その中で描画処理に最も頻繁にもちいられる java.awt.Canvas クラスを 例として解説しましょう。

・ Canvasクラスを継承し、描画処理を組み込んだ簡単なクラスを設計してみましょう。


/** Canvasのサブクラス */
public class WelcomeCanvas extends Canvas {

  /** 描画メソッド */
    public void paint( Graphics g ) {
        g.drawString( "Welcome to Wakkanai", 20, 20 );
    }
}

paint()メソッドは Canvasが Componentから継承したメソッドです。 すべての JDKのコンポーネントは、再描画が必要になった時 (それを知らせるイベントが伝達された時)、 この paint()メソッドが自動的に呼び出される仕組みになっています。 つまり描画処理のメソッド名はあらかじめ定められているわけです。 また描画に必要となる Graphicsのオブジェクトは、 paint()の引数として与えられます。
原則として描画の処理はすべて paint()のような描画専用のメソッド (もしくはそこから間接的に呼び出される下請けのメソッド) の内部にまとめて記述します。 そうしておかないと、再描画の処理が完全に実行できないからです。