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を使っていくことにしましょう。

※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。