クリスマスやバレンタインデーなどは、人によっては一大イベントです。ある人はプレゼントを買ったり、レストランを予約したり、チョコレートを作ったり、もらったりするかもしれません。その人は自分の意思でそうしているかもしれませんが、実はイベントによってそう行動するようにプログラムされている、と考えることもできます(そんなことを考えるのはプログラマーだけでしょうけど)。
イベントを契機に行動を開始することを、プログラミングの世界では「イベントドリブン(イベント駆動)」といいます。特に、Javaのようなグラフィカルな画面を持つプログラミング言語では、たくさんの種類のイベントがあります。
iアプリとMIDletで共通する主なイベントを以下にリストします。
イベントは種類が違ってもその扱い方は大体同じです(クリスマスも恋人の誕生日も大体同じでしょ?)。ということで、ここではTrimisで実際に使用しているキー関連のイベントの扱い方を解説します。
ソースコードの345行目から369行目までを見てください。
345 public void keyPressed(KeyEvent e) { ……【中略】…… 361 } 362 363 public void keyReleased(KeyEvent e) { 364 // このイベントは利用しないので実装する必要はない 365 } 366 367 public void keyTyped(KeyEvent e) { 368 // このイベントは利用しないので実装する必要はない 369 }
この3つのメソッドが、キー関連のイベントが発生すると呼び出されます。なぜ、この3つをこういう名前で実装しなければならないかを知っているかというと、それはjava.awt.event.KeyListenerインターフェイスに説明が書かれているからです。
Trimisでは、3つのうち1つしか使用していません。筆者はクリスマスは毎年何もしませんが、プログラミングでも、イベントが発生しても何もしない、ということが可能です。
先ほど、キーイベントが発生した際に自動的に呼び出されるメソッドが3つある、と説明しましたが、自動的に呼び出してもらうための手続きが必要です。それが「イベントリスナー」という仕組みです。
ソースコードの37行目を見てください。
37 addKeyListener(this);
この処理は、キーイベントが発生したら、そのイベントを受け取るイベントリスナーを登録しています。引数のthisというのは自分自身、つまりTrimisAppletのインスタンスを指しています。
addKeyListenerメソッドは引数にKeyListenerというキーイベントを受け取るイベントリスナーを渡すのですが、ここではTrimisAppletを渡しています。変だと思いませんか? これには、仕組みがあります。
ここで、ソースコードの10行目を見てください。
10 public class TrimisApplet extends Applet implements Runnable, KeyListener {
Javaにはクラスと似た位置付けに、「インターフェイス」という、本質的には異なるものを同一視するための仕組みがあります。
最近のケータイは、カメラ、ワンセグ、音楽プレーヤが付いているものが当たり前です。ケータイは電話ですが、カメラ機能のおかげで、電話でもありカメラでもあるといえるわけです。本質的には異なるケータイもデジカメも、それぞれにカメラ機能があるのでカメラであるというわけです。ケータイに何があれば、何が実装されていればカメラになるか、と考えます。
レンズですね。ケータイをカメラにするためには、カメラ機能、すなわちカメラというインターフェイスを実装すればよくて、そのインターフェイスの内容はレンズだったわけです。
プログラムに戻りましょう。10行目では、「implements」というキーワードがありますが、これ以降に実装するインターフェイスを列挙します。Trimisでは2つしか書かれていませんが、必要に応じて増やすことができますし、必要がなければimplementsごと省略することもできます。
implementsの後に書いたインターフェイスは、そのインターフェイスに定義されているメソッドを、そのクラスにすべて用意してやる必要があります。話が前後しましたが、前述した「イベントで挙げた3つのメソッド」がそれになります。何もしなくてよい必要のないメソッドがありましたが、インターフェイスで定義されているメソッドは、必要がなくても用意しなければなりません。
今回の場合のようにkeyPressedだけ必要でkeyReleasedとkeyTypedは必要ない、イベントリスナーの一部のメソッドだけ必要でほかは必要ないというケースは結構あります。そういうときのために、「アダプター」というクラスが用意されています。KeyListenerならKeyAdapterです。アダプターを使えば、必要なメソッドだけを実装すればよいのでプログラムがすっきりします(363行目や367行目の何もしないメソッドがなくなります)。
アプレットもケータイJavaのプログラムも、何はなくとも描画ができなければなりません。描画先を取得する方法はアプレット、iアプリ、MIDletによってそれぞれ方法が異なりますが、描画の仕方はどれもほぼ同じです。
アプレットでもiアプリでもMIDletでも、描画を行うには「Graphics」というクラスのインスタンスを取得する必要があります。このインスタンスは「グラフィックスコンテキスト」と呼ばれます。
このグラフィックスコンテキストは大変便利で、用意されている描画メソッドを呼び出すと、取得した元が何であれ、そこに意図したとおりに描画されます。キャンバスにもイメージにもコンポーネントにも自在に描画可能です。
この連載では、アプレットは「コンポーネント」に、iアプリは「キャンバス」に、MIDletは「イメージ」に描画を行うことにします。
Copyright © ITmedia, Inc. All Rights Reserved.