Imageクラスとアプレット内での取り扱い

Imageクラスと、 それを扱うために Appletクラスに用意されたメソッドについて解説します。

 イメージを取り扱うためには awtパッケージの Imageクラスを利用します。 イメージの取り扱いはシステムの実装に大きく依存します。 そのため Imageクラスは abstractクラスで、通常のアプレットのプログラムの 中で、コンストラクタを用いたオブジェクトの生成は行えません。 Imageクラスのオブジェクトを得るためには、 Appletクラスに用意された専用のメソッドを用いることになります。

 最も重要なメソッドが getImage()です。 このメソッドは、引数に指定された URLをデータの読み込み先として、 イメージのオブジェクトを生成します。 引数の指定には複数の方法が可能です。 次のサンプルのように、「データの URLをそのまま指定」することもできます。 また、 「データの置かれているディレクトリの URL」と「Stringクラスのパス名」という 2つの引数を与える方法も便利です。


URL url1, url2;  String filename;

Image image1 = getImage( url1 );
Image image2 = getImage( url2,  filename );

ディレクトリのURLは、 HTMLのドキュメントのある場所から相対的に指定できると便利です。 その目的のために、Appletクラスはメソッド getDocumentBase() および getCodeBase()も用意されています。 getDocumentBase() は HTMLファイルの存在するディレクトリの URL を、 getCodeBase()はアプレットのバイトコードが置かれている URLを返します。 たとえば、HTMLファイルからパラメータによって パス名が指定できるようにした場合には getDocumentBase() を用いて、 HTMLファイルの存在するディレクトリを出発点にするといいでしょう。 これに対して、指定がない場合のためのデフォルトのデータの指定には、 getCodeBase() を用いて、 アプレットのプログラムから見た相対指定でデータにアクセスできるように するのが望ましいでしょう。


String source = getParameter("source"); // パラメータからソース名
if( source != null )
    Image image = getImage( getDocumentBase(),  source );
else
    Image image = getImage( getCodeBase(),  "default.gif" );

 イメージの表示を行うには、 Graphicsクラスのメソッド drawImage() を利用します。 最初の引数は表示したい Imageのオブジェクト、 続く2つの引数はイメージのアプレット内の座標です。


Graphics g;  Image image;
g.drawImage( image, 0, 0, this );  

イメージのサイズを調べるためのメソッド getWidth(),getHeight() を使います。 これらは Imageクラスのメソッドです。 また、drawImage()メソッドの第4、5引数に int型の数値を与えると、 それらは表示されるイメージのサイズと解釈されます。 (イメージは「切り取られる」のではなく、自動的に伸縮します。) たとえば次の例は、イメージを縦横に2倍に拡大して表示します。

Graphics g;  Image image;
int w = image.getWidth( this );
int h = image.getHeight( this );
g.drawImage( image, 0, 0, w*2, h*2, this );  

 ところで、getWidth(),getHeight(),drawImage()の各メソッドで 引数に指定している this は何を意味しているのでしょうか?  this は特別なキーワードで、そのクラス自身を表します。 つまりイメージを呼び出したアプレット自身です。 this が引数で渡される理由は、 イメージの読み込み処理が独立したスレッドによって 処理されること関係があります。 イメージの読み込みとイメージの表示の処理がうまく同期をとるため、 Appletクラスにはイメージからのメッセージを受け取る ImageObserver という機能が 実装されています。 イメージのデータがある程度読み込まれるたびに、 アプレットはその通知を受け取り、 再表示の処理を自動的に呼び出せる仕組みになっています。 (アプレットの使用するイメージが、 処理を行いながら少しずつ表示されるのは、この機構のおかげです。)