ケータイJavaのいろは 第二回 ユーザー・インタフェースの基礎


IDGジャパン JavaWorld 2001年7月号 に掲載された記事の原文を公開します。 編集の手がかなり加えられて掲載されたため、 雑誌に掲載されたものとは異なる部分があります (無断転載禁止)。

i モード対応 Java プロファイルの構成 / 基本あれこれ / ヒット&ブローゲーム / コラム / 戻る / トップページ


i モード対応 Java プロファイルの構成

API 構成

i モード対応 Java プロファイルは 3 つの API 層から構成されています。 Java2ME CLDC で定義されている Java API、 i モード対応 Java プロファイルで定義されている i-mode 用 API、 携帯メーカーによる機種ごとの拡張機能用 API の 3 層です (図 1)。
 
(図1 API の構成)
 
CLDC で定義されている API は言語である Java を構成するもので、 ユーザーインターフェースのクラスさえも含まれていない 必要最小限のクラスです。 Standard Edition のクラスのサブセットで java. で始まるパッケージと CLDC で拡張された javax.microedition. で始まるパッケージがあります。 この部分に関しては同じ CLDC 上のプロファイルである MIDP も同じ API を持っています。
 
普段使われている Standard Edition のクラスのサブセットなので、 Standard Edition のクラスの全てが使えるとは限りません。 具体的には java パッケージでは java.io, java.lang, java.util のみが存在し、 各パッケージの中にあるクラスやそのメソッドも数が減っていますので、 注意してください。
 
i-mode 用 API は com.nttdocomo. で始まるパッケージで、 ユーザーインターフェースや i モード対応 Java プロファイル独自の機能を 操作する API です。それぞれのパッケージの内容は表 1 のとおりです。
 
パッケージ 内容 実際に含まれるクラス
com.nttdocomo.ui ユーザーインターフェース ユーザーインターフェースに関わるクラス全般
com.nttdocomo.util ユーティリティー タイマークラス
com.nttdocomo.lang プロファイルの基本 メソッドの未サポート例外
com.nttdocomo.io 入出力 HTTP 接続クラス
com.nttdocomo.net ネットワーク URL 文字列変換クラス
(表1 com.nttdocomo. パッケージの分類)
 
拡張機能用 API については現在も仕様が公開されていないため、 詳細はわかっていません。 拡張機能用 API を使用すれば当然特定機種でしか動作しなくなり、 音声やバイブレーション機能は機種ごとの拡張機能用 API に含まれます。
 

ユーザーインターフェース

 
i モード対応 Java プロファイルのユーザーインターフェース (UI) として com.nttdocomo.ui パッケージが用意されていますが、 このユーザーインターフェースには高レベル API UI と 低レベル API UI の 2 種類があります。
 
高レベル API UI はボタンや文字列などのコンポーネントを 画面に追加する簡単な方法です。 低レベル API UI は自由に絵を描くことができ、 自分で表示や入力を処理する方法です。 この 2 種類ではイベントの処理などの方法が異なります。 本連載では今後数回は高レベル API UI を扱っていこうと思います。

基本あれこれ

Hello.java

まずは前回開発に使用した Hello.java を使って i アプリの基本の枠組みについて解説していきましょう。
 
(図2 Hello.java 実行結果)
 

i アプリの基本

 
まず、i アプリは Applet が java.applet.Applet クラスを 継承するのと同様に、com.nttdocomo.ui.IApplication クラスを 継承して作ります。 IApplication クラスを継承したら、start() メソッドを オーバーライドする必要があります。 このメソッドは i アプリが起動した時に呼ばれるメソッドです。
 

高レベル API UI の基本

 
Hello.java では start() メソッドで表示する文字を登録しています。 画面そのものが Display クラス、 表示される内容は Frame オブジェクトで表現されます。 高レベル API UI では表示される内容として Frame クラスの サブクラスの Panel クラスのオブジェクトを使います。 setCurrent(Frame frame) メソッドで Display クラスに設定します (リスト 1 の 22 行目)。
 
高レベル API UI ではこの Panel オブジェクトに add(Component c) メソッドでコンポーネントを追加していきます。 この例では文字列 (ラベル) を追加しています。 ラベルは com.nttdocomo.ui.Label クラスで表現され、 コンストラクタの 1 番目の引数で表示する文字列、 2 番目の引数で表示位置 (左寄せ、右寄せ、センタリング) を指定します。 ただし、表示位置の指定に対する実際の表示位置は機種依存のため、 必ずしも指定位置に寄せて表示されるとは限りません。
 
ラベル以外にも使用できるコンポーネントとして表 2 のクラスがあります。 これらも Panel に追加できます。
 
クラス 機能
Label 文字列
ImageLabel 画像
Button ボタン
ListBox リスト
TextBox テキスト入力
Ticker 流れる文字列
VisualPresenter メディア再生
(表2、UI コンポーネント)
 

Hello2.java

 
さて、このままでは i アプリを終了させるのに携帯電話の 強制終了ボタンを押さなければならず、行儀の良いアプリとは言えません。 そこで、ボタンコンポーネントを追加し、 このボタンを押すと i アプリが終了するように改良しましょう (リスト 2、図 3)。
 
(図3 Hello2.java 実行結果)
 

高レベル API UI のイベントの基本

 
ボタンを押すとイベントが発生しますので、 まずはそのイベントを受け取ります。 高レベル API UI ではイベントはリスナーによって処理できます。 ここでは「ボタンを押す」とコンポーネントの操作に関するイベントなので、 ComponentListener インターフェースをリスナーとして使います (リスト 2 の 3 行目)。
 
全てのイベントは各 Component オブジェクトにではなく、 Panel オブジェクトに通知され、そこからリスナーへと通知されます。 そのためにリスナーは Panal オブジェクトに setComponentListener(ComponentListener listener) メソッドで登録します。 また、Java2 Standard Edition とは異なり、add***Listener ではなく、 set***Listener であり、 リスナーは 1 つしか設定できない点にご注意ください。
 
コンポーネントが操作される (ここではボタンが押される) と リスナーの componentAction(Component source,int type,int param) メソッドが呼ばれます。変数 source にはイベントの発生した UI コンポーネントが、type にはイベントの種類が ComponentListener クラスの定数で、param にはイベントごとの パラメーター値が渡されます。 ボタンの場合、type には BUTTON_PRESSED が、param には 0 が渡されます。
 

i アプリ終了方法

 
i アプリを終了させるには IApplication オブジェクトの terminate() メソッドを呼び出します。 System.exit() は使用しないでください。

ヒット&ブローゲーム

ルール説明

 
それでは、高レベル API UI を使って簡単なヒット&ブローゲームを 作ってみようと思います。
 
ヒット&ブローゲームとは隠された 3 桁の数字を当てる遊びです。 遊び手が適当な 3 桁の数字を入力すると コンピューターが答えの数字と遊び手が示した数字を比べ、 ヒット数 (hit) とブロー数 (blow) を教えてくれます。 そのヒット数とブロー数から答えを予測し、 再び予想される 3 桁の数字を入力する。 これを繰り返し、出来るだけ少ない回数で答えを言い当てる遊びです。
 

HitBlow.java

 
ヒット&ブローゲームの画面構成は図 4 のとおりです。 画面左上に予想する数値を入力し、 「予想する」ボタンを押すとその結果が画面下に表示されていきます。
 
このソースファイルが HitBlow.java (リスト 3) になります。
 
(図4 HitBlow.java 実行結果)
 

コンポーネント

 
このプログラムで行っていることは基本的には Hello.java で述べた方法と同じです。 Panel オブジェクトにコンポーネントを順に追加して Display クラスに設定することで表示を行い、 ComponentListener インターフェースを使ってボタンを 押したときの処理を書きます。
 
予想の入力、結果の表示のためにコンポーネントの TextBox クラスを使っています。TextBox クラスは文字入力のために 使用するのが普通ですが、 メソッド setEditable(boolean b) で編集不可能にすることが出来ますので、 ここでは結果の表示にも使っています。
 
タイトルは画像で表示していますが、 画像表示にコンポーネントの ImageLabel クラスを使っています。 ImageLabel クラスはコンストラクタで Image オブジェクトを指定します。 Image クラスは Java2 StandardEdition と同様に 画像を表しているクラスです。
 

画像の読み込み

 
画像の読み込み、つまり Image オブジェクトの取得には MediaManager クラスと MediaImage クラスを使用します。 MediaManager クラスは画像を始めとしたリソースを読み込むクラス、 MediaImage クラスは読み込まれた画像を表すクラスです。
 
MediaManager クラスのクラスメソッド getImage(String location) に 画像の置き場所を指定して MediaImage オブジェクトを取得します。 ここでは JAR ファイルから画像を読み取るため (脚注:KToolbar では res フォルダの下に置かれたリソースは自動的に JAR ファイルに含まれます)、 画像の置き場所は resource:// の後にファイル名を指定することになります。 MediaImage オブジェクトを取得したら、 use() メソッドを呼んで実際の読み込みを実行させます。 この時にファイルが存在しないと com.nttdocomo.io.ConnectionException 例外が投げられるため、 try〜catch で囲んでエラー処理を書く必要があります。 その後、MediaImage オブジェクトから Image オブジェクトやその大きさを取得することが出来ます。
 
Image オブジェクトを使い終わったら MediaImage オブジェクトの unuse() メソッドで使用終了を宣言し、 dispose() メソッドでリソースを開放します (リスト 3 の 32 行目)。
 

ソフトキー

 
プログラムの終了にはソフトキーを使用することにします。 ソフトキーとは場面に応じた機能が割り当てられているキーで、 携帯電話の画面下にその役割が表示されています。 i アプリでは基本的に 2 つのソフトキー (脚注:使い方は公開されていませんが、 D503i では 4 つあるようです) が使用できます。
 
ソフトキーを押した時にはソフトキー押下イベントが発生します。 ソフトキーイベントはコンポーネント操作イベントと同様に リスナーによって処理します。 リスナーは SoftKeyListener インターフェースを実装したクラスになり、 リスナーの設定は Panal オブジェクトの setSoftKeyListener(SoftKeyListener listener) メソッドで設定します。
 
ソフトキーが押されるとソフトキーリスナーの softKeyPressed(int softKey) メソッドが呼ばれます。 引数 softKey にはいずれのソフトキーが押されたかが Frame.SOFT_KEY_1 または Frame.SOFT_KEY_2 で示されます。
 
また、Panel オブジェクトの setSoftLabel(int key,String label) メソッドで携帯電話の画面下に 表示されているソフトキーの役割表示を変更できます (リスト 3 の 37 行目)。

[コラム]

au の Java の最新事情

 
4/12 に au (KDDI) の Java 対応携帯電話に関する情報が公開されました。 API は MIDP に準拠し、KDDI-P と呼ばれる独自拡張が加わります。 その仕様は端末発売直前の見通しです。 Java 対応携帯電話 (cdmaOne 端末) は 6, 7 月にリリース、 10 月以降にはさらに改良版をリリース予定で、 夏以降のほぼ全ての端末に Java が搭載されます。
 
特徴として、50KB のプログラムの実行が可能、 アプリケーション間の通信機能が豊富、C-MIDI・SMAF 形式のサポート、 個人情報・端末情報が取得できるなどがあげられます。 セキュリティーを考慮して、アプリケーション間通信や個人情報・ 端末情報の取得は公式コンテンツのみに許されます。
 

P503i での注意点

 
P503i で 4 月に開発した i アプリがダウンロードできない 不具合が見つかっています。これは ADF の最終更新日の記述で、 本来は「Apr」と記述すべきところが P503i のみ「Apl」と 記述しなければダウンロードができないためです。 そのため、更新日に 4 月を使用しないか、 P503i のみ別の ADF を用意するなどして対処しましょう。 詳細は http://www.nttdocomo.co.jp/i/java/caution.html をご覧ください。

戻る