ケータイ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 をご覧ください。
戻る