Commandとイベント
続いて、MIDletでの「イベント処理」について説明していきましょう。サンプルでは、液晶画面の左下に「Exit」という表示があり、そのすぐ下にあるキー(携帯キーの一番左上にあるキー)を押すと、プログラムを終了するようになっています。この画面の下部の左右に表示されているテキストは、一般に「ソフトキー」と呼ばれるもののラベルです。ソフトキーというのは、携帯キーの一番上の左右にあるキーです。液晶画面下部の左右にある表示は、この左右のソフトキーの役割を示すラベルなのですね。
画面左下の「Exit」は、そのすぐ下にある左ソフトキーの働きを表示する。右にある「Qwerty」は、システムによって自動的に割り当てているもの。 |
このソフトキーの操作は、「Command」と「CommandListener」によって構成されます。Commandは、何かのキーを押したときに実行する処理となるクラスです。そしてCommandListenerは、このCommandによるイベントを処理するためのインターフェイスです。
MIDletでは、ソフトキーに何かの処理を行わせる場合、まず使用するソフトキーのCommandインスタンスを作成し、MIDletに組み込みます。そして、やはりMIDletに、Commandのイベント処理をするCommandListenerを組み込みます。Commandを組み込むことで、指定したソフトキーのラベルが表示されるようになり、そのキーを押すとCommandListenerに用意されているイベント処理用メソッドが呼び出され、必要な処理を行う、というわけです。
ここでは、Commandをフィールドとして保管し、利用しています。フィールド部分を見ると、以下のようなものがありますね。
private Command exitCommand;
このexitCommandが、左ソフトキーのCommandです。インスタンスの作成は、コンストラクタで行っています。
exitCommand = new Command("Exit", Command.EXIT, 0);
new Commandでは、引数を3つ指定します。第1引数にはラベルに表示するテキストを渡します。
第2引数にはどのような役割かを示すタイプ値を指定します。これはCommandクラスに暮らすフィールドとして用意されている値から選びます。ここではプログラムの終了を示す「EXIT」を指定しています。タイプ値には、この他に「BACK」「CANCEL」「HELP」「ITEM」「OK」「SCREEN」「STOP」といったものが用意されています。
第3引数にはプライオリティ(優先度)を示す整数値を指定します。これは数値が低いほど優先度が高いことを意味します。ここではゼロを指定し、もっとも優先度を高くしています。
こうして作成されたCommandは、Displayに表示するオブジェクト(ここではTextBox)に「addCommand」で組み込まれます。startAppメソッドを見ると、
t.addCommand(exitCommand);
このようにして組み込んでいることがわかりますね。これで、CommandがTextBoxに組み込まれ、TextBoxが画面に表示されると自動的にソフトキーにそれが設定されるようになります。
CommandListenerとイベント処理
このCommandが組み込まれると、指定のソフトキーを押したときにイベントが発生するようになります。このイベントは、CommandListenerによって処理されます。クラスの定義部分をよく見てみると、
public class HelloMIDlet extends MIDlet implements CommandListener {……
このようにして、CommandListenerがimplementsされていることがわかります。このCommandListenerでは、イベントが発生すると、「commandAction」というメソッドが呼び出されるような仕組みになっています。これは、以下のような形で定義されます。
public void commandAction(Command c, Displayable s) {……}
引数には、イベントが発生したCommandインスタンスと、画面に表示されているオブジェクトが渡されます。ここではTextBoxが画面に表示されていますが、画面に表示可能なアイテムは、すべて「Displayable」インターフェイスを実装しており、このインスタンスが渡されるようになっています。
ここでは、引数で渡されたCommandが、exitCommandであるかどうかをチェックし、もしそうならば以下のようにしてプログラムを終了しています。
destroyApp(false);
notifyDestroyed();
プログラムの終了は、自身のdestroyAppを呼び出して行います。その後のnotifyDestroyedは、仮想マシンにプログラムの終了を知らせるためのものです。これによりプログラムは安全に終了できます。
――さて、ざっと初期状態で生成されるソースコードについて説明を行いました。このソースコードには、MIDletのもっとも重要な部分が一通りそろっています。まずは、このソースコードを完全に読み解くことからはじめましょう。それぞれの働きがきっちりと頭に入ったところで、少しずつMIDPを使っていくことにしましょう。