「イベント」きっかけで動くプログラム
クリスマスやバレンタインデーなどは、人によっては一大イベントです。ある人はプレゼントを買ったり、レストランを予約したり、チョコレートを作ったり、もらったりするかもしれません。その人は自分の意思でそうしているかもしれませんが、実はイベントによってそう行動するようにプログラムされている、と考えることもできます(そんなことを考えるのはプログラマーだけでしょうけど)。
イベントを契機に行動を開始することを、プログラミングの世界では「イベントドリブン(イベント駆動)」といいます。特に、Javaのようなグラフィカルな画面を持つプログラミング言語では、たくさんの種類のイベントがあります。
iアプリとMIDletで共通する主なイベント
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.
関連記事
- Eclipseではじめるプログラミング
- いまから始めるJava
- ドコモの仕様とMIDPはどう違う?
- 第1回 NTTドコモの公式開発ツールを使おう
- 第2回 実機で動作するiアプリの作成
- 第3回 メディアリソースを利用して絵と音のあるiアプリ作成
- 第4回 HTTP通信とスクラッチパッドへのアクセス
- 第5回 CGIによるGET/POSTメソッドを使った送受信
- 第6回 互換性のあるiアプリ作成法
- 第7回 iアプリを10Kbytesに収めるテクニック
- MIDPプログラミング入門
- Google Android用携帯アプリ作成のための基礎知識
- 第1回 モバイルFeliCaでHello FeliCa
- 第2回 モバイルFeliCaでスロットゲームを作ろう