3.1 Graphicsクラス
3.1.1 描画処理
アプレットも含め、Java で開発する GUI アプリケーションは 1 つ以上の部品によって構成されます。GUI の部品とは、例えばボタンやコンボボックス、リストボックス、テキストエリア、そしてウィンドウなどが存在します。Java ではこうした GUI 部品は、必ず java.awt.Component クラスを継承しています。Component クラスは GUI 部品の基本的な機能を備えた抽象クラスなのです。
また、Windows では GUI 部品のことをコントロールと呼んでいますが、Java の世界ではコンポーネントと呼びます。
アプレットもコンポーネントなので Component クラスを継承しています。Component クラスは、最初に画面に表示されたときや、一部分が他のウィンドウなどによって隠され、再び表示されようとしている時などの損傷が発生すると paint() メソッドを呼び出します。コンポーネントの開発者は paint() メソッドをオーバーライドすることで、コンポーネントに必要な描画処理を記述することができます。
public void paint(Graphics g)
描画処理では、このメソッドの引数に渡される Graphics クラスが最も重要となります。java.awt.Graphics クラスはテキストや図、イメージなどを描画する機能を提供します。Graphics クラスは抽象クラスなのでコンストラクタを呼び出すことはできません。なぜならば、Graphics クラスのインスタンスが参照する物理デバイスが抽象化されているためです。アプリケーションプログラマは、描画先がディスプレイであれ、プリンタであれ、もしくはメモリ上のビットマップイメージであれ、Graphics クラスを用いて抽象的に記述することができるのです。Graphics クラスの実体について知る必要はありません。
java.lang.Object | +--java.awt.Graphics
public abstract class Graphics extends Object
Component クラスの paint() メソッドのパラメータとして受け取る Graphics クラスのインスタンスは、そのコンポーネントの矩形を参照しています。この Graphics インスタンスの描画メソッドを使って描画すると、すなわちコンポーネントの矩形に図やテキストを表示するということになります。
この場ではまず、コンポーネントにテキストを表示してみましょう。文字列を表示するには Graphics クラスの drawString() メソッドを使います。
public abstract void drawString(String str, int x, int y)
str パラメータには表示する文字列を、x パラメータには文字列を表示する X 座標、y パラメータには Y 座標を指定します。Graphics クラスの座標系は、他の多くのシステムで使われているものと同じく、描画対象の左上隅を原点 (0 , 0) とし、X 座標が増えるほど右に、Y 座標が増えるほど下に向かいます。
import java.applet.Applet; import java.awt.*; //<applet code="Test.class" width="400" height="400"></applet> public class Test extends Applet { public void paint(Graphics g) { g.drawString("Kitty on your lap" , 0 , 20); System.out.println("paint() メソッドの実行"); } }
コード1をアプレットビューワで実行すると、実行結果のようにアプレット上に指定した文字列が描画されます。これは、ブラウザで起動しても同じ結果を得ることができるでしょう。
paint() メソッドでは、drawString() メソッドでテキストを描画した後、println() メソッドを用いて標準出力に paint() メソッドを実行したことを示す文字列を出力しています。アプレットビューワでプログラムを実行して paint() メソッドが呼び出されるタイミングを観察すると、ウィンドウが表示されたときに必ず呼び出されています。ウィンドウの一部や全体を他のウィンドウで隠した後、再びウィンドウを表示させようとすると、ウィンドウの破損部分を再び描画するために paint() メソッドが呼び出されていることを確認することができます。