Comments
Description
Transcript
小林 真美
2009 年 1 月 27 日 情報文化演習 山本昌弘教授 卒業制作 東京ディズニーランド アトラクション待ち時間アプリ 国際文化学部 国際文化学科 05G0911 小林真美 1 <目次> 1.はじめに 1.1 システムの制作動機・・・・・・・・・・・・・・・・・・・・1 1.2 開発環境・・・・・・・・・・・・・・・・・・・・・・・・・1 1.3 本 i アプリの実行に必要なファイル・・・・・・・・・・・・・3 2.システムの機能・・・・・・・・・・・・・・・・・・・・・・・・・5 2.1 アトラクションの待ち時間表示・入力・・・・・・・・・・・・6 2.2 ファストパスの発券時間帯の表示・入力・・・・・・・・・・・9 2.3 レストランの混雑状況の表示・入力・・・・・・・・・・・・10 2.4 ショーやパレードのイベントが開始するまでの時間のカウントダウン・・11 2.5 入場制限の状況の表示・入力・・・・・・・・・・・・・・・11 3.ソースコード解説・・・・・・・・・・・・・・・・・・・・・・・12 3.1 パッケージのインポート・・・・・・・・・・・・・・・・・12 3.2 IApplication クラス・・・・・・・・・・・・・・・・・・・13 3.3 変数・・・・・・・・・・・・・・・・・・・・・・・・・・13 3.4 アプリの開始・・・・・・・・・・・・・・・・・・・・・・14 3.5 Display クラス・・・・・・・・・・・・・・・・・・・・・14 3.6 トップページのクラス・・・・・・・・・・・・・・・・・・15 3.7 アトラクションの待ち時間の表示ページのクラス・・・・・・16 3.8 アトラクションの待ち時間の入力ページのクラス・・・・・・20 3.9 ファストパスの発券状況の表示ページのクラス・・・・・・・22 3.10 ファストパスの発券状況の入力ページのクラス・・・・・・25 3.11 レストランの混雑状況の表示ページのクラス・・・・・・・26 3.12 レストランの混雑状況の入力ページのクラス・・・・・・・27 3.13 イベントが開始するまでの時間のカウントダウンのページのクラス・・28 3.14 入場制限の状況を入力するページのクラス・・・・・・・・30 4.コンポーネントイベントの設定・・・・・・・・・・・・・・・・・31 4.1 トップページのコンポーネントイベント・・・・・・・・・・31 4.2 アトラクションの待ち時間、ファストパスの発券状況、レストラン の混雑状況の表示ページのコンポーネントイベント・・・・・・・・・・33 4.3 アトラクション待ち時間の入力ページのコンポーネントイベント・・・33 4.4 ファストパスの発券時間帯の入力ページのコンポーネントイベント・・34 4.5 レストランの混雑状況の入力ページのコンポーネントイベント・・・・34 2 4.6 入場制限の情報を更新するページのコンポーネントイベント・・・・・35 5.スクラッチパッド・・・・・・・・・・・・・・・・・・・・・・・35 5.1 バイトデータ・・・・・・・・・・・・・・・・・・・・・・35 5.2 ストリーム・・・・・・・・・・・・・・・・・・・・・・・35 5.3 スクラッチパッドへの書き込み・・・・・・・・・・・・・・36 5.4 スクラッチパッドからの読み込み・・・・・・・・・・・・・37 6.本システムにおけるスクラッチパッド・・・・・・・・・・・・・・38 6.1 アトラクションの待ち時間の入力ページのスクラッチパッド・・38 6.2 ファストパスの発券時間帯の入力ページのスクラッチパッド・・40 6.3 レストランの混雑状況の入力ページのスクラッチパッド・・・41 6.4 入場制限の情報を更新するページのスクラッチパッド・・・・43 7.時刻の取得・・・・・・・・・・・・・・・・・・・・・・・・・・46 7.1 アトラクションの待ち時間、ファストパスの発券状況、レストラン の混雑状況、入場制限の情報更新の入力ページでの時刻の取得・・・・・47 7.2 イベントが開始するまでの時間のカウントダウンのページでの時刻 の取得・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・47 8.おわりに・・・・・・・・・・・・・・・・・・・・・・・・・・・49 9.参考文献・・・・・・・・・・・・・・・・・・・・・・・・・・・50 3 1.はじめに 1.1 システムの制作動機 私はゼミで卒業制作のシステムを発案する際に、自分の身近な場所で役に立 つものを作りたいと考えていた。そこで、私はアルバイト先の東京ディズニー ランドに関するシステムを制作しようと思い立った。土曜日や日曜日、祝日は 7万を超える客が来園することが頻繁にあるので、たくさんの人々が広い園内 で快適に過ごせるようなシステム作りを目指した。例えばアルバイトの際、舞 浜駅には多くの人々がいるにも関わらず、来園者多数のために入場制限が行わ れていることがしばしばある。これは、折角遊びに来た人々を落胆させてしま うことにつながるので、私はアルバイトの視点からこの問題を解決するような システムを制作したいと考えた。また、私は以前から客として東京ディズニー ランドに遊びに行く際に、全てのアトラクションの待ち時間を一度に確認した いと考えていた。なぜなら、利用したいアトラクションがあっても待ち時間が 長いと他のアトラクションを先に利用したりしていたので、それぞれのアトラ クションの場所まで出向いて待ち時間を確認してからどれを利用するか決定す る行為が面倒だと感じていたからだ。全てのアトラクションの待ち時間の情報 が時間や場所を問わずに一度に入手できると、上記の手間が省けるので客の移 動の効率化が実現し、時間の有効利用につながる。このように、私はアルバイ トと客としての双方の視点を活かしてシステムを開発しようと決意した。 1.2 開発環境 本システムは東京ディズニーランドで利用されることが目的なので、携帯電 話を媒体に選んだ。NTT ドコモが提供している i アプリは DoJa プロファイル を採用しているのに対し、KDDI が提供している EZ アプリやソフトバンクモバ イルが提供している S!アプリは世界中で広く普及している Mobile Information Device Profile(通称 MIDP)を採用している。DoJa と MIDP は互換性がない。 3キャリア全ての携帯電話に対応したアプリケーションを制作することが不可 能なので、私は自身が利用している NTT ドコモの携帯電話で使える i アプリを 開発することに決めた。i アプリを作成するために必要なツールは Java2 SDK, Standard Edition Version 1.4 (JDK1.4) と iαppli Development Kit の 2 つだ。 Java2 SDK, Standard Edition Version 1.4 は、コンピュータ上で動く Java ア プリケーションを開発するキットで、サン・マイクロシステムズのサイトから インストールできる。また、iαppli Development Kit は、実際に i アプリを作 成するための開発ツールで、ボタン 1 つでビルド(実行ファイルの作成)や、 エミュレータでのアプリ実行(携帯電話における i アプリの動作を想定したコン ピュータ上でのテスト)を行うことができる。これは NTT ドコモのサイトから 4 無償で入手可能である。 DoJa プロファイル向けの開発ツールは現在 DoJa-1.x から DoJa-5.x まであり、私は本システムを製作するにあたり、最新の DoJa-5.0 を選択し、インストールした。 そして FTP ソフトを使用し、ファイルを自身のサーバースペースにアップロ ードした。FTP ソフトとしてフリーソフトの FFFTP を利用した。 5 そして次に、携帯電話に本 i アプリをダウンロードした。i モードのメニュー か ら 「 Internet → < URL 入 力 > 」 を 選 択 し 、 http://www14.ocn.ne.jp/~mamipoco/と入力すると、”DOWNLOAD”と表示され たページが開かれる。この”DOWNLOAD”を選択すると、本 i アプリが携帯電話 にダウンロードされる。 1.3 本 i アプリの実行に必要なファイル ・TDL_WaitingTime.jar:本システムのソースコードである TDL_WaitingTime.java を i-appliTool のビルドボタンを押し、メッセージ 領域に「ビルド終了」、「チェック終了」と表示されると生成されるファ イル ・TDL_WaitingTime.jam:JAR ファイルが完成し、i アプリの属性ファイル である ADF(Application Descriptor File)を作成すると生成されるファイル 6 ・index.html:本 i アプリをダウンロードするための HTML で、以下が記述 内容である。 [index.html] <HTML> <HEAD> <TITLE>Download Page</TITLE> </HEAD> <BODY> 7 <OBJECT declare id="TDL_WaitingTime" data="TDL_WaitingTime.jam" type="application/x-jam"> </OBJECT> <BR> <A ijam="#TDL_WaitingTime" href="notapplicable.html">DOWNLOAD</A> </BODY> </HTML> index.html では、”DOWNLOAD”を選択したときに、対応端末なら TDL_WaitingTime.jam が示す i アプリをダウンロードし、非対応端末 なら notapplicable.html を開くように指定している。 ・notapplicable.html:本 i アプリの対応端末を表示する HTML で、以下が 記述内容である。 [notapplicable.html] <HTML> <HEAD> <TITLE>Error</TITLE> </HEAD> <BODY> この i アプリの対応機種は<BR> 505i,506i,70Xi,80Xi,90Xi<BR> です。 </BODY> </HTML> 2.システムの機能 本システムが持つ機能は、東京ディズニーランドにあるアトラクションの待 ち時間の表示・入力、ファストパスの発券時間帯の表示・入力、レストランの 混雑状況の表示・入力、ショーやパレードのイベントが開始するまでの時間の カウントダウン、そして、入場制限の状況の表示・入力である。それぞれの表 示機能はもちろんだが、入力機能も全てのユーザーが利用することができるの で、ユーザー同士で情報を共有するための協力が必要である。それぞれの機能 の詳細を以下で順番に説明する。 8 2.1 アトラクションの待ち時間表示・入力 東京ディズニーランドのアトラクションの入り口には、乗り場までの時間を 表示するボードがある。客はそれぞれのアトラクションのある場所まで移動し、 そのボードに記載されている待ち時間を確認してから利用する。あるアトラク ションを利用したくても、待ち時間が長ければ他のアトラクションを先に利用 するのが一般的だが、携帯電話で全てのアトラクションの待ち時間が一度に確 認できればそのような手間が省け、客の移動の効率化や、時間の有効利用など の利便性が実現する。また、列に並んでいる間に全アトラクションの待ち時間 の情報を入手できれば、時間を無駄にすることなく容易に次に利用するアトラ クションを決定することができる。そこで私はテーマランド毎にアトラクショ ンの待ち時間を表示・入力する機能を作成した。まず、下の図のトップページ に6つのテーマランドの項目から成る単一選択型のリストボックスがある。 このリストボックスからどれか1つの項目を選択すると、下の図の各々のテー マランドのアトラクションの待ち時間の表示ページに遷移する。この表示ペー ジはテーマランドのタイトルやアトラクション名、待ち時間、更新日時で構成 されている。そして、 「他のアトラクションも調べる」というアンカーボタンを 押すと、最初のトップページが表示され、 「あたらしく待ち時間を入力する」と いうアンカーボタンを押すと、下の図のそれぞれのテーマランドのアトラクシ ョンの待ち時間の入力ページに切り替わる。入力ページはタイトルやティッカ ー(左方向に流れる文字列)、アトラクション名、テキストボックス、決定ボタ ンで構成されている。このページでテキストボックスの部分を選択すると、入 力画面が現れる。そして、半角数字での入力が完了し、横にある決定ボタンを 押すと、テキストボックスに入力された文字列と、決定ボタンが押された瞬間 9 の年月日と時刻が取得され、待ち時間表示ページに切り替わる。 10 11 2.2 ファストパスの発券時間帯の表示・入力 ファストパスとは一部の人気アトラクションが採用していて、発券されたパ スに記載された時間帯にそのアトラクションを利用しにいけば、通常の列で並 んでいる客とは別にファストパス専用の入り口から優先入場できるシステムを 持つ券のことだ。自分で時間帯を指定するのではなく、発券機が順次指定する 時間帯に従わなければならない。また、一度ファストパスを取得すると、その ファストパスに記載されている一定時間が経過するまで他のアトラクションの ファストパスを取得することはできない。東京ディズニーランドの閉園時間ま でのファストパスが全て発券されると終了する。発券が終了する時間はアトラ クションによって異なる。先に発券が終了するアトラクションのファストパス から取得すれば、より多くの異なるファストパスを効率的に取得できる。私は ファストパスの発券状況の情報が携帯電話で一度に入手できると利便性が高ま ると考え、この機能を作成した。まず、トップページで「ファストパスの発券 時間を調べる」というアンカーボタンを押すと、下図のファストパスの発券時 間帯の表示ページに遷移する。この表示ページは、タイトルやアトラクション 名、発券時間帯、更新日時で構成されている。アトラクションの待ち時間の表 示ページと同様に、 「他のアトラクションも調べる」というアンカーボタンを押 すとトップページが表示され、 「ファストパスの情報を更新する」というアンカ ーボタンを押すとファストパスの時間帯の入力ページに遷移する。入力ページ はタイトルやアトラクション名、ポップアップ形式のリストボックス、決定ボ タンで成り立っている。このリストボックスの中の項目のどれか1つを選択し、 下の決定ボタンを押すと、選択された項目の文字列とボタンが押された瞬間の 年月日と時刻が取得され、表示ページに切り替わる。 12 2.3 レストランの混雑状況の表示・入力 ランチやディナーの時間になると、多くの客が一斉にレストランを利用する ため、限られた空間である東京ディズニーランドでは、食事をする場所を見つ けるのに苦労することがしばしばある。そこで私は、屋内型のレストランの混 雑状況を確認できる機能があれば、客が空いているレストランを探し求めて移 動する手間が省けると考え、作成した。まず、トップページにある「レストラ ンの空席情報を調べる」というアンカーボタンを押すと、下図の表示ページに 遷移する。この表示ページはタイトルや「ワゴンは掲載されていません」とい う注意書き、テーマランド名、レストラン名、空席のあり・なし、更新日時で 構成されている。レストランの混雑状況表示の機能はアトラクションの待ち時 間の表示機能と異なり、テーマランドの区分を超えて、全レストランを一斉に 表示するシステムだ。下までスクロールすると、2つのアンカーボタンが現れ、 トップページに戻って他の機能を利用するか、レストランの空席情報を入力し て更新するか選択できる。 「レストランの空席情報を更新する」というアンカー ボタンを押すと、下図の入力ページに遷移する。この入力ページはタイトル、 注意書き、テーマランド名、ポップアップ形式のリストボックス、決定ボタン で構成されている。レストラン毎のリストボックスにはそれぞれ「空席あり」 と「満席」の2つの項目が用意してあり、どちらかを選択する仕組みだ。最後 に決定ボタンを押すと、選択された項目の文字列とボタンが押された瞬間の年 月日と時刻が取得され、表示ページに切り替わる。 13 2.4 ショーやパレードのイベントが開始するまでの時間のカウントダウン この機能は、当日のショーやパレードのイベントの開始時間とそれが始まる までの時間を表示して知らせることで、見逃しを防ぐことが目的だ。トップペ ージにある「本日のイベント」のアンカーボタンを押すと、下図のページに遷 移する。このカウントダウンのページはタイトルやイベントの名前、開始時刻、 残り時間で構成されている。このページにはユーザーが入力する機能は付いて いないので、私自身が情報を更新する。 2.5 入場制限の状況の表示・入力 土曜日や日曜日、祝日は入場者多数のため、制限がかかることがしばしばあ る。折角遊びに行っても、園内に入れなければ客の貴重な休日は台無しになっ 14 てしまう。そこで私は、あらかじめ携帯電話で入場制限に関する情報を公開す れば客がその日の計画を立てやすくなると考え、この機能を作成した。まず、 トップページから「入場制限の情報を更新する」というアンカーボタンを押す と、下図の入力ページに遷移する。この入力ページはタイトルや入場制限に関 するポップアップ形式のリストボックス、入場制限の解除予定時刻のポップア ップ形式のリストボックス、決定ボタンで構成されている。入場制限のリスト ボックスの中には「あり」と「なし」の2つの項目がある。解除予定時刻のリ ストボックスの中には 12:00 から 17:30 まで 30 分毎に区切られた時間の項目が ある。2つのリストボックスからそれぞれ項目を選択し、最後に決定ボタンを 押すと、それぞれの文字列が取得され、下図のようにトップページに切り替わ り、一番下にその文字列が表示される。 3.ソースコード解説 本システムがどのように作成されているのか、ソースコードを部分的に抜粋 しながら具体的に解説する。 3.1 パッケージのインポート [TDL_WaitingTime.java の一部] import com.nttdocomo.ui.*; import javax.microedition.io.*; import java.io.*; import java.util.*; import とはパッケージを使うときに必要な予約語である。パッケージとは 15 NTT ドコモの i アプリだけでなく、ソフトバンクの S!アプリや au の EZ アプリ でも利用されている JavaME CLDC の API という処理能力やメモリなどの制限 のある端末(PDA や携帯電話など)を対象としている汎用的な API と、i アプ リ基本 API(Application Programming Interface)という i アプリに特化した基 本的な処理を行うための API が持っているもので、上記のように記述する。本 プログラムでは下表のパッケージが使用されている。 JavaME CLDC の API パッケージ名 概要 java.io データの入出力を行うための クラスを持つ Java.util 日時の取得や乱数の発生など、特定の 目的のために設計されたクラスを持つ javax.microedition.io データの入出力先に接続するための クラスを持つ I アプリ基本 API パッケージ名 概要 com.nttdocomo.ui GUI(Graphical User Interface)関連の クラスを持つ 3.2 IApplication クラス [TDL_WaitingTime.java の一部] public class TDL_WaitingTime ComponentListener { extends IApplication implements IApplication クラスは i アプリの土台となる基本的な機能を持っているクラス で、全ての i アプリはまずこのクラスを継承して、i アプリ本体となるクラスを 作 成 す る 。 ”extends” は ク ラ ス を 継 承 す る こ と の 宣 言 で ”implements ComponentLitener”はコンポーネントイベント(ボタンを押すと発生するイベ ントなど)を受け取るためのリスナーインタフェースを実装するという意味で ある。 3.3 変数 i アプリはキャンバスかパネルを使って作成される。キャンバスとは線や図形、 テキストが自由に描画できる低レベル API のことで、パネルとはラベルやリス トボックス、ボタンなどのコンポーネントを使用する高レベル API のことであ る。両方を使用してプログラムを作成するのは難易度が高いので、私はプログ ラムの構成上、パネルを選択した。本プログラムではパネルに下表のコンポー ネントを使用している。 16 コンポーネント名 機能 Label 1行のテキストを表示 Button ボタンを設置 AnchorButton HTML のアンカー風のボタンを設置 ListBox 各種の選択リストを設置 TextBox 入力フィールドを設置 Ticker スクロールする文字列を表示 HTMLLayout HTML 風のレイアウト 本プログラムでは以下のように変数が宣言されている。 [TDL_WaitingTime.java の一部] private Panel //パネル ∼省略∼ private ListBox //リストボックス ∼省略∼ private Label //ラベル ∼省略∼ private TextBox //テキストボックス ∼省略∼ private Button //ボタン ∼省略∼ private AnchorButton //アンカーボタン ∼省略∼ private Ticker //ティッカー ∼省略∼ private HTMLLayout layout ; //HTML レイアウト 3.4 アプリの開始 3.2で記した IApplication クラスを継承したクラスは、start メソッドを必 ず持つ(オーバーライドする)必要があり、このメソッドは i アプリが起動した ときに一度だけ実機から呼ばれる。 [TDL_WaitingTime.java の一部] public void start() { 17 3.5 Display クラス Display クラスは画面に表示するキャンバスかパネルを指定するクラスであ る。下のステートメントでは、Display クラスの setCurrent()メソッドで本シス テムのトップページである panel_TOP クラスをセットしている。 [TDL_WaitingTime.java の一部] Display.setCurrent(panel_TOP); 3.6 トップページのクラス 下のクラスは本システムのトップページを形成するクラスである。3.3で 宣言した変数を使用して作成されている。コメントを付けて本プログラムを解 説していく。 [TDL_WaitingTime.java の一部] panel_TOP = new Panel(); //Panel オブジェクトを new で生成 layout = new HTMLLayout(); //HTMLLayout を生成 //レイアウトマネージャーをパネルにセット panel_TOP.setLayoutManager(layout); //パネルのタイトル(画面の1番上の水色部分)を作成 panel_TOP.setTitle("TDL アトラクション待ち時間表示アプリ"); //HTMLLayout の begin メソッドで中央にコンポーネントを配置 Layout.begin(HTMLLayout.CENTER); //シングル選択リストを生成 lb_TOP = new ListBox(ListBox.SINGLE_SELECT); //append メソッドを使ってリストボックスの末尾に項目を追加 lb_TOP.append("アドベンチャーランド"); lb_TOP.append("ウエスタンランド"); lb_TOP.append("クリッターカントリー"); lb_TOP.append("ファンタジーランド"); lb_TOP.append("トゥーンタウン"); lb_TOP.append("トゥモローランド"); lb_TOP.select(0); //リストボックスの 0 番目の項目を選択 //アンカーボタンを生成 AB_FP = new AnchorButton("ファストパスの発券時間を調べる"); AB_restaurant = new AnchorButton("レストランの空席情報を調べる"); 18 AB_to_CD = new AnchorButton("本日のイベント"); AB_to_attendance = new AnchorButton("入場制限の情報を更新する"); //入場制限の情報が表示されるラベルをあらかじめ空白で用意しておく loadLabel_atd = new Label(""); //入場制限の有無 loadLabel_ATtime = new Label(""); //解除予定時刻 calLabel_attendance = new Label(""); //更新時刻 //コンポーネントをパネルに追加 panel_TOP.add(lb_TOP); layout.br(); //改行 layout.br(); panel_TOP.add(AB_FP); layout.br(); panel_TOP.add(AB_restaurant); layout.br(); panel_TOP.add(AB_to_CD); layout.br(); panel_TOP.add(AB_to_attendance); layout.br(); layout.br(); panel_TOP.add(loadLabel_atd); layout.br(); panel_TOP.add(loadLabel_ATtime); layout.br(); panel_TOP.add(calLabel_attendance); layout.end(); //レイアウトマネージャーの終了 //コンポーネントリスナーをこのパネル自体にセット //コンポーネントで発生したイベントを受け取る panel_TOP.setComponentListener(this); 3.7 アトラクションの待ち時間の表示ページのクラス 下のクラスはアトラクションの待ち時間を表示するページのクラスである。 3.3で宣言した変数を使用して作成されている。6つのテーマランド毎に分 かれているため、全部で6クラスあるが、代表してアドベンチャーランドのク ラスを抜粋し、コメントを付けて解説していく。 [TDL_WaitingTime.java の一部] 19 panel_ADV = new Panel(); //Panel オブジェクトを new で生成 layout = new HTMLLayout(); //HTMLLayout を生成 //レイアウトマネージャーをパネルにセット panel_ADV.setLayoutManager(layout); panel_ADV.setTitle("アドベンチャーランド"); //タイトルを作成 //HTMLLayout の begin メソッドで中央にコンポーネントを配置 layout.begin(HTMLLayout.CENTER); //setBackground()メソッドでパネルの背景色をセット // Graphics クラスの getColorOfRGB()メソッドで RGB 値を取得 panel_ADV.setBackground(Graphics.getColorOfRGB(0,102,0)); label_ADV1 = new Label("カリブの海賊:" ); //ラベルを生成 // setBackground()メソッドでラベルの背景色をセット // setForeground()メソッドでラベルの前景色をセット label_ADV1.setBackground(Graphics.getColorOfRGB(0,102,0)); label_ADV1.setForeground(Graphics.getColorOfRGB(255,255,255)); //入力ページから取得された待ち時間が表示される空のラベルを生成 loadLabel_ADV1 = new Label(""); loadLabel_ADV1.setBackground(Graphics.getColorOfRGB(0,102,0)); loadLabel_ADV1.setForeground(Graphics.getColorOfRGB(255,255,255)); //入力ページで待ち時間が更新された時刻が表示される空のラベルを生成 calLabel_ADV1 = new Label(""); calLabel_ADV1.setBackground(Graphics.getColorOfRGB(0,102,0)); calLabel_ADV1.setForeground(Graphics.getColorOfRGB(255,255,255)); label_ADV2 = new Label("ジャングルクルーズ:"); //ラベルを生成 //ラベルの背景色と前景色をセット label_ADV2.setBackground(Graphics.getColorOfRGB(0,102,0)); label_ADV2.setForeground(Graphics.getColorOfRGB(255,255,255)); //入力ページから取得された待ち時間が表示される空のラベルを生成 loadLabel_ADV2 = new Label(""); loadLabel_ADV2.setBackground(Graphics.getColorOfRGB(0,102,0)); loadLabel_ADV2.setForeground(Graphics.getColorOfRGB(255,255,255)); //入力ページで待ち時間が更新された時刻が表示される空のラベルを生成 calLabel_ADV2 = new Label(""); calLabel_ADV2.setBackground(Graphics.getColorOfRGB(0,102,0)); calLabel_ADV2.setForeground(Graphics.getColorOfRGB(255,255,255)); label_ADV3 = new Label("ウエスタンリバー鉄道:" ); //ラベルを生成 20 //ラベルの背景色と前景色をセット label_ADV3.setBackground(Graphics.getColorOfRGB(0,102,0)); label_ADV3.setForeground(Graphics.getColorOfRGB(255,255,255)); //入力ページから取得された待ち時間が表示される空のラベルを生成 loadLabel_ADV3 = new Label(""); loadLabel_ADV3.setBackground(Graphics.getColorOfRGB(0,102,0)); loadLabel_ADV3.setForeground(Graphics.getColorOfRGB(255,255,255)); //入力ページで待ち時間が更新された時刻が表示される空のラベルを生成 calLabel_ADV3 = new Label(""); calLabel_ADV3.setBackground(Graphics.getColorOfRGB(0,102,0)); calLabel_ADV3.setForeground(Graphics.getColorOfRGB(255,255,255)); label_ADV4 = new Label("スイスファミリー・ツリーハウス:" ); //ラベルを生成 label_ADV4.setBackground(Graphics.getColorOfRGB(0,102,0)); label_ADV4.setForeground(Graphics.getColorOfRGB(255,255,255)); //入力ページから取得された待ち時間が表示される空のラベルを生成 loadLabel_ADV4 = new Label(""); //ラベルの背景色と前景色をセット loadLabel_ADV4.setBackground(Graphics.getColorOfRGB(0,102,0)); loadLabel_ADV4.setForeground(Graphics.getColorOfRGB(255,255,255)); //入力ページで待ち時間が更新された時刻が表示される空のラベルを生成 calLabel_ADV4 = new Label(""); calLabel_ADV4.setBackground(Graphics.getColorOfRGB(0,102,0)); calLabel_ADV4.setForeground(Graphics.getColorOfRGB(255,255,255)); label_ADV5 = new Label("魅惑のチキルーム:" ); //ラベルを生成 //ラベルの背景色と前景色をセット label_ADV5.setBackground(Graphics.getColorOfRGB(0,102,0)); label_ADV5.setForeground(Graphics.getColorOfRGB(255,255,255)); //入力ページから取得された待ち時間が表示される空のラベルを生成 loadLabel_ADV5 = new Label(""); loadLabel_ADV5.setBackground(Graphics.getColorOfRGB(0,102,0)); loadLabel_ADV5.setForeground(Graphics.getColorOfRGB(255,255,255)); //入力ページで待ち時間が更新された時刻が表示される空のラベルを生成 calLabel_ADV5 = new Label(""); calLabel_ADV5.setBackground(Graphics.getColorOfRGB(0,102,0)); calLabel_ADV5.setForeground(Graphics.getColorOfRGB(255,255,255)); //アンカーボタンを生成 21 AB_to_top_from_ADV = new AnchorButton("他のアトラクションも調べる"); AB_to_top_from_ADV.setBackground(Graphics.getColorOfRGB(0,102,0)); AB_to_top_from_ADV.setForeground(Graphics.getColorOfRGB(255,255,255)); AB_to_inputADV = new AnchorButton("あたらしく待ち時間を入力する"); AB_to_inputADV.setBackground(Graphics.getColorOfRGB(0,102,0)); AB_to_inputADV.setForeground(Graphics.getColorOfRGB(255,255,255)); //パネルにコンポーネントを追加 panel_ADV.add(label_ADV1); panel_ADV.add(loadLabel_ADV1); layout.br(); //改行 panel_ADV.add(calLabel_ADV1); layout.br(); layout.br(); panel_ADV.add(label_ADV2); panel_ADV.add(loadLabel_ADV2); layout.br(); panel_ADV.add(calLabel_ADV2); layout.br(); layout.br(); panel_ADV.add(label_ADV3); panel_ADV.add(loadLabel_ADV3); layout.br(); panel_ADV.add(calLabel_ADV3); layout.br(); layout.br(); panel_ADV.add(label_ADV4); panel_ADV.add(loadLabel_ADV4); layout.br(); panel_ADV.add(calLabel_ADV4); layout.br(); layout.br(); panel_ADV.add(label_ADV5); panel_ADV.add(loadLabel_ADV5); layout.br(); panel_ADV.add(calLabel_ADV5); layout.br(); 22 layout.br(); panel_ADV.add(AB_to_top_from_ADV); panel_ADV.add(AB_to_inputADV); layout.end(); //レイアウトマネージャーの終了 //コンポーネントリスナーをこのパネル自体にセット panel_ADV.setComponentListener(this); 3.8 アトラクションの待ち時間の入力ページのクラス 下のクラスはアトラクションの待ち時間を入力するページのクラスである。 3.3で宣言した変数を使用して作成されている。6つのテーマランド毎に分 かれているため、全部で6クラスあるが、代表してウエスタンランドのクラス を抜粋し、コメントを付けて解説していく。 [TDL_WaitingTime.java の一部] panel_WTN_input = new Panel(); //Panel オブジェクトを new で生成 layout = new HTMLLayout(); //HTMLLayout を生成 //レイアウトマネージャーをパネルにセット panel_WTN_input.setLayoutManager(layout); //タイトルを作成 panel_WTN_input.setTitle("ウエスタンランド 入力ページ"); //HTMLLayout の begin メソッドで中央にコンポーネントを配置 layout.begin(HTMLLayout.CENTER); //パネルの背景色をセットする panel_WTN_input.setBackground(Graphics.getColorOfRGB(153,0,0)); ticker_WTN = new Ticker("半角数字で入力してください"); //ティッカー作成 ticker_WTN.setBackground(Graphics.getColorOfRGB(255,255,0)); label_WTN1 = new Label("ウエスタンランド・シューティングギャラリー:"); //ラベル作成 //ラベルの背景色と前景色をセット label_WTN1.setBackground(Graphics.getColorOfRGB(153,0,0)); label_WTN1.setForeground(Graphics.getColorOfRGB(255,255,255)); //初期文字列と桁数、行数、表示モードを指定してテキストボックスを生成 tb_WTN1 = new TextBox("", 3, 1, TextBox.DISPLAY_ANY); btn_WTN1 = new Button("決定"); //ボタンを作成 label_WTN2 = new Label("カントリーベア・シアター:"); //ラベル作成 label_WTN2.setBackground(Graphics.getColorOfRGB(153,0,0)); label_WTN2.setForeground(Graphics.getColorOfRGB(255,255,255)); 23 //初期文字列と桁数、行数、表示モードを指定してテキストボックスを生成 tb_WTN2 = new TextBox("", 3, 1, TextBox.DISPLAY_ANY); btn_WTN2 = new Button("決定"); label_WTN3 = new Label("ザ・ダイヤモンドホースシュー:"); //ラベル作成 label_WTN3.setBackground(Graphics.getColorOfRGB(153,0,0)); label_WTN3.setForeground(Graphics.getColorOfRGB(255,255,255)); //初期文字列と桁数、行数、表示モードを指定してテキストボックスを生成 tb_WTN3 = new TextBox("", 3, 1, TextBox.DISPLAY_ANY); btn_WTN3 = new Button("決定"); label_WTN4 = new Label("蒸気船マークトウェイン号:"); //ラベル作成 label_WTN4.setBackground(Graphics.getColorOfRGB(153,0,0)); label_WTN4.setForeground(Graphics.getColorOfRGB(255,255,255)); //初期文字列と桁数、行数、表示モードを指定してテキストボックスを生成 tb_WTN4 = new TextBox("", 3, 1, TextBox.DISPLAY_ANY); btn_WTN4 = new Button("決定"); label_WTN5 = new Label("ビッグサンダー・マウンテン:"); //ラベル作成 label_WTN5.setBackground(Graphics.getColorOfRGB(153,0,0)); label_WTN5.setForeground(Graphics.getColorOfRGB(255,255,255)); //初期文字列と桁数、行数、表示モードを指定してテキストボックスを生成 tb_WTN5 = new TextBox("", 3, 1, TextBox.DISPLAY_ANY); btn_WTN5 = new Button("決定"); label_WTN6 = new Label("トムソーヤ島いかだ:"); //ラベル作成 label_WTN6.setBackground(Graphics.getColorOfRGB(153,0,0)); label_WTN6.setForeground(Graphics.getColorOfRGB(255,255,255)); //初期文字列と桁数、行数、表示モードを指定してテキストボックスを生成 tb_WTN6 = new TextBox("", 3, 1, TextBox.DISPLAY_ANY); btn_WTN6 = new Button("決定"); //パネルにコンポーネントを追加 panel_WTN_input.add(ticker_WTN); panel_WTN_input.add(label_WTN1); panel_WTN_input.add(tb_WTN1); panel_WTN_input.add(btn_WTN1); layout.br(); panel_WTN_input.add(label_WTN2); panel_WTN_input.add(tb_WTN2); panel_WTN_input.add(btn_WTN2); 24 layout.br(); panel_WTN_input.add(label_WTN3); panel_WTN_input.add(tb_WTN3); panel_WTN_input.add(btn_WTN3); layout.br(); panel_WTN_input.add(label_WTN4); panel_WTN_input.add(tb_WTN4); panel_WTN_input.add(btn_WTN4); layout.br(); panel_WTN_input.add(label_WTN5); panel_WTN_input.add(tb_WTN5); panel_WTN_input.add(btn_WTN5); layout.br(); panel_WTN_input.add(label_WTN6); panel_WTN_input.add(tb_WTN6); panel_WTN_input.add(btn_WTN6); layout.end(); //レイアウトマネージャーの終了 //コンポーネントリスナーをこのパネル自体にセット panel_WTN_input.setComponentListener(this); 3.9 ファストパスの発券状況の表示ページのクラス 下のクラスはファストパスの待ち時間を表示するページのクラスである。3. 3で宣言した変数を使用して作成されている。ファストパスの表示ページの基 本的構造は、3.7のアトラクションの待ち時間の表示ページのクラスと同じ である。 [TDL_WaitingTime.java の一部] panel_FP = new Panel(); //Panel オブジェクトを new で生成 layout = new HTMLLayout(); //HTMLLayout を生成 //レイアウトマネージャーをパネルにセット panel_FP.setLayoutManager(layout); panel_FP.setTitle("ファストパス発券状況"); //タイトルを作成 //HTMLLayout の begin メソッドで中央にコンポーネントを配置 layout.begin(HTMLLayout.CENTER); label_WTN5 = new Label("ビッグサンダー・マウンテン:"); //ラベル作成 label_WTN5.setBackground(Graphics.getColorOfRGB(153,0,0)); 25 label_WTN5.setForeground(Graphics.getColorOfRGB(255,255,255)); loadLabel_WTN5_FP = new Label(""); //発券時間帯を表示する空ラベル calLabel_WTN5_FP = new Label(""); //更新時刻を表示する空ラベル label_CRT1 = new Label("スプラッシュマウンテン:"); //ラベル作成 label_CRT1.setBackground(Graphics.getColorOfRGB(51,153,255)); label_CRT1.setForeground(Graphics.getColorOfRGB(255,255,255)); loadLabel_CRT1_FP = new Label(""); //発券時間帯を表示する空ラベル calLabel_CRT1_FP = new Label(""); //更新時刻を表示する空ラベル label_FNT7 = new Label("ホーンテッドマンション:"); //ラベル作成 label_FNT7.setBackground(Graphics.getColorOfRGB(255,0,255)); label_FNT7.setForeground(Graphics.getColorOfRGB(255,255,255)) loadLabel_FNT7_FP = new Label(""); //発券時間帯を表示する空ラベル calLabel_FNT7_FP = new Label(""); //更新時刻を表示する空ラベル label_FNT10 = new Label("プーさんのハニーハント:"); //ラベル作成 label_FNT10.setBackground(Graphics.getColorOfRGB(255,0,255)); label_FNT10.setForeground(Graphics.getColorOfRGB(255,255,255)); loadLabel_FNT10_FP = new Label(""); //発券時間帯を表示する空ラベル calLabel_FNT10_FP = new Label(""); //更新時刻を表示する空ラベル label_TMR2 = new Label("スペース・マウンテン:"); //ラベル作成 label_TMR2.setBackground(Graphics.getColorOfRGB(0,0,204)); label_TMR2.setForeground(Graphics.getColorOfRGB(255,255,255)); loadLabel_TMR2_FP = new Label(""); //発券時間帯を表示する空ラベル calLabel_TMR2_FP = new Label(""); //更新時刻を表示する空ラベル label_TMR4 = new Label("ミクロアドベンチャー!:"); //ラベル作成 label_TMR4.setBackground(Graphics.getColorOfRGB(0,0,204)); label_TMR4.setForeground(Graphics.getColorOfRGB(255,255,255)); //入力ページから取得された時間帯が表示される空のラベルを生成 loadLabel_TMR4_FP = new Label(""); //発券時間帯を表示する空ラベル calLabel_TMR4_FP = new Label(""); //更新時刻を表示する空ラベル AB_to_top_from_FP = new AnchorButton("他のアトラクションも調べる"); AB_FPinput = new AnchorButton("ファストパスの情報を更新する"); //パネルにコンポーネントを追加 panel_FP.add(label_WTN5); panel_FP.add(loadLabel_WTN5_FP); layout.br(); panel_FP.add(calLabel_WTN5_FP); 26 layout.br(); layout.br(); panel_FP.add(label_CRT1); panel_FP.add(loadLabel_CRT1_FP); layout.br(); panel_FP.add(calLabel_CRT1_FP); layout.br(); layout.br(); panel_FP.add(label_FNT7); panel_FP.add(loadLabel_FNT7_FP); layout.br(); panel_FP.add(calLabel_FNT7_FP); layout.br(); layout.br(); panel_FP.add(label_FNT10); panel_FP.add(loadLabel_FNT10_FP); layout.br(); panel_FP.add(calLabel_FNT10_FP); layout.br(); layout.br(); panel_FP.add(label_TMR2); panel_FP.add(loadLabel_TMR2_FP); layout.br(); panel_FP.add(calLabel_TMR2_FP); layout.br(); layout.br(); panel_FP.add(label_TMR4); panel_FP.add(loadLabel_TMR4_FP); layout.br(); panel_FP.add(calLabel_TMR4_FP); layout.br(); layout.br(); panel_FP.add(AB_to_top_from_FP); layout.br(); panel_FP.add(AB_FPinput); layout.end(); //レイアウトマネージャーの終了 27 //コンポーネントリスナーをこのパネル自体にセット panel_FP.setComponentListener(this); 3.10 ファストパスの発券状況の入力ページのクラス 下のクラスはファストパスの待ち時間を入力するページのクラスの一部であ る。3.3で宣言した変数を使用して作成されている。リストボックスにはあ らかじめ項目が設定されていて、ユーザーに入力してもらうのではなく、選択 してもらう仕組みだ。 [TDL_WaitingTime.java の一部] panel_FP_input = new Panel(); //Panel オブジェクトを new で生成 layout = new HTMLLayout(); //HTMLLayout を生成 //レイアウトマネージャーをパネルにセット panel_FP_input.setLayoutManager(layout); panel_FP_input.setTitle("ファストパス情報 入力ページ"); layout.begin(HTMLLayout.CENTER); label_WTN5 = new Label("ビッグサンダー・マウンテン"); label_WTN5.setBackground(Graphics.getColorOfRGB(153,0,0)); label_WTN5.setForeground(Graphics.getColorOfRGB(255,255,255)); //ポップアップ形式のリストボックスを作成 choice_WTN5 = new ListBox(ListBox.CHOICE); choice_WTN5.append("10:00-10:30"); ∼省略∼ choice_WTN5.append("21:30-22:00"); choice_WTN5.append("発券終了"); choice_WTN5.select(0); btn_WTN5_FP = new Button("決定"); ∼省略∼ //パネルにコンポーネントを追加 panel_FP_input.add(label_WTN5); panel_FP_input.add(choice_WTN5); panel_FP_input.add(btn_WTN5_FP); 28 ∼省略∼ layout.end(); //レイアウトマネージャーの終了 //コンポーネントリスナーをこのパネル自体にセット panel_FP_input.setComponentListener(this); 3.11 レストランの混雑状況の表示ページのクラス 下のクラスはレストランの混雑状況を表示するページのクラスの一部である。 3.3で宣言した変数を使用して作成されている。このクラスの基本的構造も、 3.7のアトラクションの待ち時間の表示ページのクラスと同じである。 [TDL_WaitingTime.java の一部] panel_restaurant = new Panel(); //Panel オブジェクトを new で生成 layout = new HTMLLayout(); //HTMLLayout を生成 //レイアウトマネージャーをパネルにセット panel_restaurant.setLayoutManager(layout); panel_restaurant.setTitle("レストラン"); layout.begin(HTMLLayout.CENTER); label_resNote = new Label("ワゴンは掲載されていません"); label_resWBA = new Label("ワールドバザール"); label_resWBA.setBackground(Graphics.getColorOfRGB(255,51,153)); label_resWBA.setForeground(Graphics.getColorOfRGB(255,255,255)); label_resWBA1 = new Label("イーストサイド・カフェ:"); loadLabel_resWBA1 = new Label(""); //選択項目を表示する空ラベル calLabel_resWBA1 = new Label(""); //更新時刻を表示する空ラベル ∼省略∼ AB_to_top_from_restaurant = new AnchorButton("トップぺージに戻る"); //パネルにコンポーネントを追加 panel_restaurant.add(label_resNote); layout.br(); layout.br(); panel_restaurant.add(label_resWBA); layout.br(); 29 panel_restaurant.add(label_resWBA1); panel_restaurant.add(loadLabel_resWBA1); layout.br(); panel_restaurant.add(calLabel_resWBA1); ∼省略∼ panel_restaurant.add(AB_to_top_from_restaurant); AB_RestaurantInput = new AnchorButton("レストランの空席情報を更新する"); panel_restaurant.add(AB_RestaurantInput); layout.end(); //レイアウトマネージャーの終了 //コンポーネントリスナーをこのパネル自体にセット panel_restaurant.setComponentListener(this); 3.12 レストランの混雑状況の入力ページのクラス 下のクラスはレストランの混雑状況を入力するページのクラスの一部である。 3.3で宣言した変数を使用して作成されている。このクラスの基本的構造は、 3.9のファストパスの発券状況の入力ページのクラスと同じである。 [TDL_WaitingTime.java の一部] panel_restaurantInput = new Panel(); //Panel オブジェクトを new で生成 layout = new HTMLLayout(); //HTMLLayout を生成 //レイアウトマネージャーをパネルにセット panel_restaurantInput.setLayoutManager(layout); panel_restaurantInput.setTitle("レストラン"); layout.begin(HTMLLayout.CENTER); label_resNote = new Label("ワゴンは掲載されていません"); label_resWBA = new Label("ワールドバザール"); label_resWBA.setBackground(Graphics.getColorOfRGB(255,51,153)); label_resWBA.setForeground(Graphics.getColorOfRGB(255,255,255)); label_resWBA1 = new Label("イーストサイド・カフェ"); //ポップアップ形式のリストボックスを作成 choice_resWBA1 = new ListBox(ListBox.CHOICE); choice_resWBA1.append("空席あり"); choice_resWBA1.append("満席"); choice_resWBA1.select(0); 30 btn_resWBA1 = new Button("決定"); ∼省略∼ panel_restaurantInput.add(label_resNote); layout.br(); layout.br(); panel_restaurantInput.add(label_resWBA); layout.br(); panel_restaurantInput.add(label_resWBA1); panel_restaurantInput.add(choice_resWBA1); panel_restaurantInput.add(btn_resWBA1); ∼省略∼ layout.end(); //レイアウトマネージャーの終了 //コンポーネントリスナーをこのパネル自体にセット panel_restaurantInput.setComponentListener(this); 3.13 イベントが開始するまでの時間のカウントダウンのページのクラス 下のクラスはイベントが開始するまでの時間のカウントダウンのページのク ラスの一部である。3.3で宣言した変数を使用して作成されている。このク ラスの基本的構造も、3.7のアトラクションの待ち時間の表示ページのクラ スと同じである。 [TDL_WaitingTime.java の一部] panel_CD = new Panel(); //Panel オブジェクトを new で生成 layout = new HTMLLayout(); //HTMLLayout を生成 //レイアウトマネージャーをパネルにセット panel_CD.setLayoutManager(layout); panel_CD.setTitle("本日のイベント"); layout.begin(HTMLLayout.CENTER); panel_CD.setBackground(Graphics.getColorOfRGB(204,102,255)); label_CD1 = new Label("ジュビレーション! 15:00"); label_CD1.setBackground(Graphics.getColorOfRGB(204,102,255)); label_CD1.setForeground(Graphics.getColorOfRGB(255,255,255)); 31 loadLabel_CD1 = new Label(""); //残り時間を表示する空ラベルを作成 loadLabel_CD1.setBackground(Graphics.getColorOfRGB(204,102,255)); loadLabel_CD1.setForeground(Graphics.getColorOfRGB(255,255,255)); label_CD2 = new Label("エレクトリカルパレード・ドリームライツ 19:00"); label_CD2.setBackground(Graphics.getColorOfRGB(204,102,255)); label_CD2.setForeground(Graphics.getColorOfRGB(255,255,255)); loadLabel_CD2 = new Label(""); loadLabel_CD2.setBackground(Graphics.getColorOfRGB(204,102,255)); loadLabel_CD2.setForeground(Graphics.getColorOfRGB(255,255,255)); label_CD3 = new Label("ドリームス 20:30"); label_CD3.setBackground(Graphics.getColorOfRGB(204,102,255)); label_CD3.setForeground(Graphics.getColorOfRGB(255,255,255)); loadLabel_CD3 = new Label(""); loadLabel_CD3.setBackground(Graphics.getColorOfRGB(204,102,255)); loadLabel_CD3.setForeground(Graphics.getColorOfRGB(255,255,255)); AB_to_top_from_CD = new AnchorButton("トップ画面に戻る"); //パネルにコンポーネントを追加 panel_CD.add(label_CD1); layout.br(); panel_CD.add(loadLabel_CD1); layout.br(); layout.br(); panel_CD.add(label_CD2); layout.br(); panel_CD.add(loadLabel_CD2); layout.br(); layout.br(); panel_CD.add(label_CD3); layout.br(); panel_CD.add(loadLabel_CD3); layout.br(); layout.br(); panel_CD.add(AB_to_top_from_CD); layout.end(); //レイアウトマネージャーの終了 //コンポーネントリスナーをこのパネル自体にセット panel_CD.setComponentListener(this); 32 3.14 入場制限の状況を入力するページのクラス 下のクラスは入場制限の状況を入力するページのクラスの一部である。3. 3で宣言した変数を使用して作成されている。ちなみに、入場制限の状況を表 示するページのクラスは3.6で説明したトップページのクラスが兼ねている。 [TDL_WaitingTime.java の一部] panel_attendance = new Panel(); //Panel オブジェクトを new で生成 layout = new HTMLLayout(); //HTMLLayout を生成 //レイアウトマネージャーをパネルにセット panel_attendance.setLayoutManager(layout); panel_attendance.setTitle("入場制限の情報を更新する"); layout.begin(HTMLLayout.LEFT); panel_attendance.setBackground(Graphics.getColorOfRGB(0,255,102)); label_attendance = new Label("入場制限"); label_attendance.setBackground(Graphics.getColorOfRGB(0,255,102)); choice_atd = new ListBox(ListBox.CHOICE); choice_atd.append("あり"); choice_atd.append("なし"); choice_atd.select(0); btn_attendance = new Button("決定"); label_ATtime = new Label("解除予定時刻"); label_ATtime.setBackground(Graphics.getColorOfRGB(0,255,102)); choice_ATtime = new ListBox(ListBox.CHOICE); choice_ATtime.append("12:00"); ∼省略∼ choice_ATtime.append("17:30"); choice_ATtime.select(0); //パネルにコンポーネントを追加 panel_attendance.add(label_attendance); layout.br(); panel_attendance.add(choice_attendance); layout.br(); layout.br(); 33 panel_attendance.add(label_ATtime); layout.br(); panel_attendance.add(choice_ATtime); layout.br(); panel_attendance.add(btn_attendance); layout.end(); //レイアウトマネージャーの終了 //コンポーネントリスナーをこのパネル自体にセット panel_attendance.setComponentListener(this); 4.コンポーネントイベントの設定 コンポーネントのイベントを発生させるには ComponentListener を登録し なければならないので、前節で説明したように、本プログラムのクラスではそ れぞれ setComponentListener()メソッドが使用されている。コンポーネントリ スナーオブジェクトを登録したら、次は componentAction()メソッドを記述して 実装させる。componentAction()メソッドは、コンポーネントクラスやイベント タイプ、パラメータを引数として渡される。コンポーネントクラスにより、イ ベントタイプ、パラメータの記述が異なる。 コンポーネントクラス イベントタイプ パラメータ Button BUTTON_PRESSED (ボタンの押下) なし TextBox なし TEXT_CHANGED (テキストボックスの内容 の変更) ListBox SELECTION_CHANGED 選択されたアイテムの (リスト選択の変更) インデックス 4.1 トップページのコンポーネントイベント 本プログラムのトップページには、リストボックスとアンカーボタンのコン ポーネントが配置されている。これらのコンポーネントのアクションイベント の発生は以下のクラスによって定義される。 [TDL_WaitingTime.java の一部] public void componentAction(Component source, int type, int param) { //トップページのリストボックスの内容が変更された場合 34 if(source == lb_TOP && type == ComponentListener.SELECTION_CHANGED) { //リストボックスの項目を引数として受け取る //対応する case に分岐 switch(param) { case(0): // アドベンチャーランドのパネルを表示 Display.setCurrent(panel_ADV); break; case(1): // ウエスタンランドのパネルを表示 Display.setCurrent(panel_WTN); break; case(2): // クリッターカントリーのパネルを表示 Display.setCurrent(panel_CRT); break; case(3): //ファンタジーランドのパネルを表示 Display.setCurrent(panel_FNT); break; case(4): //トゥーンタウンのパネルを表示 Display.setCurrent(panel_TON); break; case(5): //トゥモローランドのパネルを表示 Display.setCurrent(panel_TMR); break; } } //”ファストパスの発券時間を調べる”のアンカーボタンが押された場合 if(source == AB_FP && type == ComponentListener.BUTTON_PRESSED) { Display.setCurrent(panel_FP); //ファストパス発券状況のパネルを表示 } //”レストランの空席情報を調べる”のアンカーボタンが押された場合 if(source == AB_restaurant && type == ComponentListener.BUTTON_PRESSED) { Display.setCurrent(panel_restaurant); //レストランの空席情報のパネルを表示 } 35 //”本日のイベント”のアンカーボタンが押された場合 if(source == AB_to_CD && type == ComponentListener.BUTTON_PRESSED) { CD(); //カウントダウンに必要な CD クラスを実行 Display.setCurrent(panel_CD); //カウントダウンのパネルを表示 } //”入場制限の情報を更新する”アンカーボタンが押された場合 if(source == AB_to_attendance && type == ComponentListener.BUTTON_PRESSED) { Display.setCurrent(panel_attendance); //入場制限の入力パネルを表示 } 4.2 アトラクションの待ち時間、ファストパスの発券状況、レストランの 混雑状況の表示ページのコンポーネントイベント アトラクションの待ち時間、ファストパスの発券時間帯、レストランの混雑 状況を表示するページにはそれぞれ、トップページに遷移するアンカーボタン と入力するページに遷移するアンカーボタンが2つずつ設置されている。これ らのコンポーネントに関するイベントの発生は以下のように定義されている。 代表してファストパスの発券時間帯を表示するクラスを説明する。 [TDL_WaitingTime.java の一部] //”他のアトラクションも調べる”アンカーボタンが押された場合 if(source == AB_to_top_from_FP && type == ComponentListener.BUTTON_PRESSED) { Display.setCurrent(panel_TOP); //トップページを表示 } //”ファストパスの情報を更新する”アンカーボタンが押された場合 if(source == AB_FPinput && type == ComponentListener.BUTTON_PRESSED) { Display.setCurrent(panel_FP_input); //ファストパスの入力パネルを表示 } 4.3 アトラクション待ち時間の入力ページのコンポーネントイベント アトラクションの待ち時間を入力するページには、テキストボックスと決定 ボタンが設置されている。これらのコンポーネントに関するイベントの発生は 以下のクラスのクラスによって定義される。代表してアドベンチャーランドの 1つ目のアトラクションの待ち時間を入力するクラスを説明する。if 文の中で実 行されるクラスについては、後に説明する。 36 [TDL_WaitingTime.java の一部] //アドベンチャーランドの入力ページで"決定"ボタンが押された場合 //アトラクション1 if(source == btn_ADV1 && type == ComponentListener.BUTTON_PRESSED) { writeScratch_ADV1(); //スクラッチパッドへの書き込み readScratch_ADV1(); //スクラッチパッドからの読み込み cal_ADV1(); //"決定"ボタンが押されたときの時刻を取得する Display.setCurrent(panel_ADV); //アドベンチャーランドのパネルを表示 } 4.4 ファストパスの発券時間帯の入力ページのコンポーネントイベント ファストパスの発券時間帯を入力するページには、リストボックスと決定ボ タンが設置されている。これらのコンポーネントに関するイベントの発生は以 下のクラスによって定義される。例としてファストパスの1つ目の項目のクラ スのみ抜粋する。if 文の中で実行されるクラスについては、後に説明する。 [TDL_WaitingTime.java の一部] //ファストパスの入力ページで"決定"ボタンが押された場合 if(source == btn_WTN5_FP && type == ComponentListener.BUTTON_PRESSED) { writeScratch_WTN5_FP(); //スクラッチパッドへの書き込み readScratch_WTN5_FP(); //スクラッチパッドからの読み込み cal_WTN5_FP(); //"決定"ボタンが押されたときの時刻を取得する Display.setCurrent(panel_FP); } 4.5 レストランの混雑状況の入力ページのコンポーネントイベント レストランの混雑状況を入力するページには、リストボックスと決定ボタン が設置されている。これらのコンポーネントに関するイベントの発生は以下の クラスによって定義される。レストランの入力ページは構造の同じ多数のクラ スの連続で構成されているので、1つだけ抜粋する。if 文の中で実行されるクラ スについては、後に説明する。 [TDL_WaitingTime.java の一部] //レストランの入力ページで"決定"ボタンが押された場合 if(source == btn_resWBA1 && type == ComponentListener.BUTTON_PRESSED) { 37 writeScratch_resWBA1(); //スクラッチパッドへの書き込み readScratch_resWBA1(); //スクラッチパッドからの読み込み cal_resWBA1(); //"決定"ボタンが押されたときの時刻を取得 Display.setCurrent(panel_restaurant); } 4.6 入場制限の情報を更新するページのコンポーネントイベント 入場制限の情報を更新するページには、リストボックスと決定ボタンが設置 されている。これらのコンポーネントに関するイベントの発生は以下のクラス によって定義される。if 文の中で実行されるクラスについては、後に説明する。 [TDL_WaitingTime.java の一部] //入場制限のページで"決定"ボタンが押された場合 if(source == btn_attendance && type == ComponentListener.BUTTON_PRESSED) { writeScratch_attendance(); //スクラッチパッドへの書き込み(有無) readScratch_attendance(); //スクラッチパッドからの読み込み(有無) writeScratch_ATtime(); //スクラッチパッドへの書き込み(解除予定時刻) readScratch_ATtime(); //スクラッチパッドからの読み込み(解除予定時刻) cal_attendance(); //"決定"ボタンが押されたときの時刻を取得 Display.setCurrent(panel_TOP); //トップページを表示 } 5.スクラッチパッド スクラッチパッド(Scratch Pad)とは、i アプリごとに割り当てられるデータ保 存領域のことである。例えば、ゲームなどでよく見かけるハイスコアなどのデ ータは、このスクラッチパッドが使用されているため、アプリ終了後も保持し 続けることができる。本システムでは、全ての入力ページで取得されたデータ を保存する際にスクラッチパッドが用いられている。 5.1 バイトデータ スクラッチパッドにはデータをバイトデータとして保存する。スクラッチパ ッドの先頭より何バイト目から読み込み、何バイト目から書き込むという操作 を行う。また、読み書きするデータの大きさの情報がなければスクラッチパッ ドは使用できない。 5.2 ストリーム 38 Java ではデータの入出力にストリームという考え方が用いられる。ストリー ムとはバイトデータの流れで、データが出てくる入力ストリーム (java.io.InputStream)と、データを流す出力ストリーム(java.io.OutputStream) がある。入力ストリームにはデータが流れ、read()メソッドを使用してデータを 取得する。出力ストリームには write()メソッドを使用してデータを流す。 入力ストリーム read() InputStream データの源 OutputStream データの源 出力ストリーム write() 5.3 スクラッチパッドへの書き込み ス ク ラッチパッドと接続するには、 javax.microedition.io パッケージの Connector ク ラ ス を 使 用 す る 。 openOutputStream() メ ソ ッ ド を 使 い 、 OutputStream オブジェクトを取得する。 [Connector クラス] Static OutputStream openOutputStream(location) <解説> 接続出力ストリームを作成し、開く <引数> location 書き込み先 <戻り値> 出力ストリーム 引数の location(書き込み先)には、以下のように指定する。 scratchpad:///0;pos = 先頭からのバイト数 ス ク ラ ッ チ パ ッ ド へ デ ー タ を 書 き 込 む に は 、 java.io パ ッ ケ ー ジ の OutputStream クラスの write()メソッドを使用する。 39 [OutputStream クラス] void write(data) <解説> data の全データ(0番目から(data.length - 1)番目のデータを書き 込む <引数> data バイトデータ スクラッチパッドと切断するには close()メソッドを使用する。切断しないと、 アプリを終了させるまでスクラッチパッドに接続できなくなる。 5.4 スクラッチパッドからの読み込み ス ク ラッチパッドと接続するには、 javax.microedition.io パッケージの Connector ク ラ ス を 使 用 す る 。 openInputStream() メ ソ ッ ド を 使 い 、 InputStream オブジェクトを取得する。 [Connector クラス] Static InputStream openInputStream(location) <解説> 入力ストリームを作成し、開く <引数> location 書き込み先 <戻り値> 入力ストリーム 引数 location(読み込み先)の書式は、先に紹介した openOutputStream()メソ ッドの引数 location(書き込み先)の書式と同じである。スクラッチパッドの先 頭の 0 バイト目から読み込むには次のように記述する。 Connector.openInputStream(“scratchpad:///0;pos=0”); ス ク ラ ッ チ パ ッ ド か ら デ ー タ を 読 み 込 む に は 、 java.io パ ッ ケ ー ジ の InputStream クラスの read()メソッドを使用する。 [InputStream クラス] void read(data) <解説> data の0番目から(data.length - 1)番目のデータに読み込んだデ ータをセットする <引数> data バイトデータ 40 スクラッチパッドと切断するには close()メソッドを使用する。 6.本システムにおけるスクラッチパッド 本システムでは、アトラクションの待ち時間を入力するページやファストパ スの発券時間を入力するページ、レストランの混雑状況を入力するページ、入 場制限の情報を更新するページでスクラッチパッドが使用されている。以下で 順番に解説していく。 6.1 アトラクションの待ち時間の入力ページのスクラッチパッド 4.3で、アトラクションの待ち時間の入力ページにあるテキストボックス に文字列を入力した後に横の決定ボタンを押すと、スクラッチパッドへの書き 込みとスクラッチパッドからの読み込みが実行されると説明した。本来は全て のテーマランドの各アトラクションのスクラッチパッドの読み書きが1つずつ 実行されるのだが、例としてアドベンチャーランドの1つ目のアトラクション のクラスだけを抜粋し、解説する。 [TDL_WaitingTime.java の一部] //スクラッチパッドへの書き込み(アドベンチャーランド1) private void writeScratch_ADV1() { //getText()メソッドでテキストボックス tb_ADV1 に入力されたデータを取得 String saveText_ADV1 = tb_ADV1.getText(); int size; byte[] data_ADV1; OutputStream out = null; //OutputStream クラスの参照を宣言 try{ //スクラッチパッドと接続 //スクラッチパッドの先頭より0番目から書き込む out = Connector.openOutputStream("scratchpad:///0;pos = 0"); //スクラッチパッドへの書き込み //getBytes()メソッドでバイトデータを取得 data_ADV1 = saveText_ADV1.getBytes(); //バイトデータの length でバイトサイズを取得 size = data_ADV1.length; out.write(size); if(size>0) out.write(data_ADV1); 41 //スクラッチパッドと切断 out.close(); //try ブロックの例外処理 } catch (Exception e) {} } //スクラッチパッドからの読み込み(アドベンチャーランド1) private void readScratch_ADV1() { int size; byte[] data_ADV1; InputStream in = null; //InputStream クラスの参照を宣言 try { //スクラッチパッドと接続 //スクラッチパッドの先頭より0番目から読み込む in = Connector.openInputStream("scratchpad:///0;pos=0"); //スクラッチパッドからの読み込み size=in.read(); data_ADV1=new byte[size]; if (size>0) in.read(data_ADV1); //スクラッチパッドと切断 in.close(); //読み込んだデータを文字に変換 //setText()メソッドで表示ページの空ラベル loadLabel_ADV1 に文字列をセット loadLabel_ADV1.setText(new String(data_ADV1) + "分"); //try ブロックの例外処理 } catch(Exception e) {} } 以降、引数 location(pos のアドレス)を変えながら、他のスクラッチパッド を繰り返し記述していく。 42 6.2 ファストパスの発券時間帯の入力ページのスクラッチパッド 4.4で、ファストパスの発券時間帯を入力するページのリストボックスと ボタンのコンポーネントイベントが発生すると、スクラッチパッドへの書き込 みとスクラッチパッドからの読み込みが実行されると説明した。本来は全ての アトラクションのスクラッチパッドの読み書きが1つずつ実行されるのだが、 例としてファストパスの1つ目のアトラクションのクラスだけを抜粋し、解説 する。 [TDL_WaitingTime.java の一部] //スクラッチパッドへの書き込み(ファストパス1) private void writeScratch_WTN5_FP() { //getItem()メソッドでリストボックス choice_WTN5 の特定の位置の項目を取得 //getSelectedIndex()メソッドで選択されている項目の位置を引数として渡す String saveText_WTN5_FP = choice_WTN5.getItem(choice_WTN5.getSelectedIndex()); int size; byte[] data_WTN5_FP; OutputStream out = null; //OutputStream クラスの参照を宣言 try{ //スクラッチパッドと接続 //スクラッチパッドの先頭より 39 番目から書き込む out = Connector.openOutputStream("scratchpad:///0;pos=39"); //スクラッチパッドへの書き込み //getBytes()メソッドでバイトデータを取得 data_WTN5_FP=saveText_WTN5_FP.getBytes(); //バイトデータの length でバイトサイズを取得 size=data_WTN5_FP.length; out.write(size); if(size>0) out.write(data_WTN5_FP); //スクラッチパッドと切断 out.close(); //try ブロックの例外処理 } catch (Exception e) {} } 43 //スクラッチパッドからの読み込み(ファストパス1) private void readScratch_WTN5_FP() { int size; byte[] data_WTN5_FP; InputStream in = null; //InputStream クラスの参照を宣言 try { //スクラッチパッドと接続 //スクラッチパッドの先頭より 39 番目から読み込む in = Connector.openInputStream("scratchpad:///0;pos=39"); //スクラッチパッドからの読み込み size=in.read(); data_WTN5_FP=new byte[size]; if (size>0) in.read(data_WTN5_FP); //スクラッチパッドと切断 in.close(); //読み込んだデータを文字に変換 //setText()メソッドで表示ページの空ラベル loadLabel_WTN5_FP に文字列をセット loadLabel_WTN5_FP.setText(new String(data_WTN5_FP)); //try ブロックの例外処理 } catch(Exception e) {} } 6.3 レストランの混雑状況の入力ページのスクラッチパッド 4.5で、レストランの混雑状況を入力するページのリストボックスとボタ ンのコンポーネントイベントが発生すると、スクラッチパッドへの書き込みと スクラッチパッドからの読み込みが実行されると説明した。本来は全てのアト ラクションのスクラッチパッドの読み書きが1つずつ実行されるのだが、例と して1つ目のレストランのクラスだけを抜粋し、解説する。 [TDL_WaitingTime.java の一部] 44 //スクラッチパッドへの書き込み(ワールドバザールのレストラン1) private void writeScratch_resWBA1() { //getItem()メソッドでリストボックス resWBA1 の特定の位置の項目を取得 //getSelectedIndex()メソッドで選択されている項目の位置を引数として渡す String saveText_resWBA1=choice_resWBA1.getItem(choice_resWBA1.getSelectedIndex()); int size; byte[] data_resWBA1; OutputStream out = null; //OutputStream クラスの参照を宣言 try{ //スクラッチパッドと接続 //スクラッチパッドの先頭より 50 番目から書き込む out = Connector.openOutputStream("scratchpad:///0;pos=50"); //スクラッチパッドへの書き込み //getBytes()メソッドでバイトデータを取得 data_resWBA1=saveText_resWBA1.getBytes(); //バイトデータの length でバイトサイズを取得 size=data_resWBA1.length; out.write(size); if(size>0) out.write(data_resWBA1); //スクラッチパッドと切断 out.close(); //try ブロックの例外処理 } catch (Exception e) {} } //スクラッチパッドからの読み込み(ワールドバザールのレストラン1) private void readScratch_resWBA1() { int size; byte[] data_resWBA1; InputStream in = null; //InputStream クラスの参照を宣言 try { //スクラッチパッドと接続 //スクラッチパッドの先頭より 50 番目から読み込む in = Connector.openInputStream("scratchpad:///0;pos=50"); 45 //スクラッチパッドからの読み込み size=in.read(); data_resWBA1=new byte[size]; if (size>0) in.read(data_resWBA1); } //スクラッチパッドと切断 in.close(); //読み込んだデータを文字に変換 //setText()メソッドで表示ページの空ラベル loadLabel_resWBA1 に文字列をセット loadLabel_resWBA1.setText(new String(data_resWBA1)); //try ブロックの例外処理 } catch(Exception e) {} } 6.4 入場制限の情報を更新するページのスクラッチパッド 4.6で、入場制限の情報を更新するページのリストボックスとボタンのコ ンポーネントイベントが発生すると、スクラッチパッドへの書き込みとスクラ ッチパッドからの読み込みが実行されると説明した。以下で内容を解説する。 [TDL_WaitingTime.java の一部] //スクラッチパッドへの書き込み(入場制限の有無) private void writeScratch_attendance() { //getItem()メソッドでリストボックス choice_atd の特定の位置の項目を取得 //getSelectedIndex()メソッドで選択されている項目の位置を引数として渡す String saveText_atd = choice_atd.getItem(choice_atd.getSelectedIndex()); int size; byte[] data_atd; OutputStream out = null; //OutputStream クラスの参照を宣言 try{ //スクラッチパッドと接続 //スクラッチパッドの先頭より 81 番目から書き込む out = Connector.openOutputStream("scratchpad:///0;pos=81"); 46 //スクラッチパッドへの書き込み //getBytes()メソッドでバイトデータを取得 data_ atd = saveText_ atd.getBytes(); //バイトデータの length でバイトサイズを取得 size = data_atd.length; out.write(size); if(size>0) out.write(data_atd); //スクラッチパッドと切断 out.close(); //try ブロックの例外処理 } catch (Exception e) {} } //スクラッチパッドへの読み込み(入場制限の有無) private void readScratch_atd() { int size; byte[] data_atd; InputStream in = null; //InputStream クラスの参照を宣言 try { //スクラッチパッドと接続 //スクラッチパッドの先頭より 81 番目から読み込む in = Connector.openInputStream("scratchpad:///0;pos=81"); //スクラッチパッドからの読み込み size=in.read(); data_atd=new byte[size]; if (size>0) in.read(data_atd); //スクラッチパッドと切断 in.close(); //読み込んだデータを文字に変換 //setText()メソッドでトップページの空ラベル loadLabel_atd に文字列をセット loadLabel_atd.setText("入場制限"+new String(data_atd)); //try ブロックの例外処理 47 } catch(Exception e) {} } //スクラッチパッドへの書き込み(入場制限の解除予定時刻) private void writeScratch_ATtime() { //getItem()メソッドでリストボックス choice_ATtime の特定の位置の項目を取得 //getSelectedIndex()メソッドで選択されている項目の位置を引数として渡す String saveText_ATtime = choice_ATtime.getItem(choice_ATtime.getSelectedIndex()); int size; byte[] data_ATtime; OutputStream out = null; //OutputStream クラスの参照を宣言 try{ //スクラッチパッドと接続 //スクラッチパッドの先頭より 82 番目から書き込む out = Connector.openOutputStream("scratchpad:///0;pos=82"); //スクラッチパッドへの書き込み //getBytes()メソッドでバイトデータを取得 data_ATtime=saveText_ATtime.getBytes(); //バイトデータの length でバイトサイズを取得 size=data_ATtime.length; out.write(size); if(size>0) out.write(data_ATtime); //スクラッチパッドと切断 out.close(); //try ブロックの例外処理 } catch (Exception e) {} } //スクラッチパッドへの読み込み(入場制限の解除予定時刻) private void readScratch_ATtime() { int size; byte[] data_ATtime; InputStream in = null; //InputStream クラスの参照を宣言 try { 48 //スクラッチパッドと接続 //スクラッチパッドの先頭より 82 番目から読み込む in = Connector.openInputStream("scratchpad:///0;pos=82"); //スクラッチパッドからの読み込み size=in.read(); data_ATtime=new byte[size]; if (size>0) in.read(data_ATtime); //スクラッチパッドと切断 in.close(); //読み込んだデータを文字に変換 loadLabel_ATtime.setText(new String(data_ATtime) + " 解除予定"); //try ブロックの例外処理 } catch(Exception e) {} } 7.時刻の取得 本システムでは、Calendar クラスを使用して、年月日と時刻の取得が行われ ている。Calendar クラスのオブジェクトから日時を取得するには、get()メソッ ドを使用する。 [Calendar クラス] int get(field) <解説> Calendar クラスのオブジェクトから日時を取得 <引数> field 取得したい情報の種類 <戻り値> 取得したい情報の値 引数の field には、Calendar クラスが持つ次の定数を指定する。 Calendar.YEAR 年 Calendar.MONTH 月 -1(1月のときは「0」) Calendar.DAY_OF_MONTH 日 Calendar.DAY_OF_WEEK 曜日(日曜日のとき「1」) Calendar.HOUR_OF_DAY 時 Calendar.MINUTE 分 49 Calendar.SECOND 秒 7.1 アトラクションの待ち時間、ファストパスの発券状況、レストランの 混雑状況、入場制限の情報更新の入力ページでの時刻の取得 4.3から4.6で、ボタンのコンポーネントイベントが発生すると時刻が 取得されると説明した。本来は全ての入力ページのテーマランドのそれぞれの 項目ごとに時刻を取得するクラスが分かれているのだが、構造は同じで変数だ けが異なるので、例としてアドベンチャーランドの1つ目のクラスのみを抜粋 し、以下で解説する。 [TDL_WaitingTime.java の一部] //Calendar メソッドで時刻を取得(アドベンチャーランド1) private void cal_ADV1() { Calendar cal; //Calendar クラス型の変数 cal を宣言 cal = Calendar.getInstance(); //Calendar のインスタンスを取得 cal.setTime(new Date()); // cal に現在の時刻を設定 String date; //年・月・日・時・分を date に編集 date = cal.get(Calendar.YEAR) + "年"; //YEAR を取得し、date に代入 int month; //変数 month を宣言 month = cal.get(Calendar.MONTH) + 1; // MONTH を取得 date = date + month + "月"; //month を date に代入 date = date + cal.get(Calendar.DATE) + "日"; //DATE を取得し、代入 //HOUR を取得し、date に代入 date = date + cal.get(Calendar.HOUR_OF_DAY) + "時"; //MINUTE を取得し、date に代入 date = date + cal.get(Calendar.MINUTE) + "分 更新"; //表示ページの空ラベル calLabel_ADV1 に date の文字列をセット calLabel_ADV1.setText(date); } 7.2 イベントが開始するまでの時間のカウントダウンのページでの時刻の 取得 イベントが開始するまでの時間をカウントダウンするページでは、現在の時 刻を取得してから、予定時刻までの差を計算している。時間帯によって表示内 50 容が変化する仕組みで、以下で解説する。 [TDL_WaitingTime.java の一部] //Calendar メソッドで時刻を取得(イベントのカウントダウン) private void CD() { Calendar cal; //Calendar クラス型の変数 cal を宣言 cal = Calendar.getInstance(); //Calendar のインスタンスを取得 cal.setTime(new Date()); // cal に現在の時刻を設定 int hour; //変数 hour を宣言 hour = cal.get(Calendar.HOUR_OF_DAY); //HOUR を取得し、代入 int minute; minute = cal.get(Calendar.MINUTE); //MINUTE を取得し、代入 String time1, time2, time3; //変数 time1, time2, time3 を宣言 //1つ目のイベント //午前8時から午後2時59分までの場合 if(hour >= 8 && hour <= 14){ //分単位で残り時間を計算 //concat()メソッドで文字列を連結 time1 = "あと".concat(String.valueOf((14-hour)*60+(60-minute))).concat("分"); //イベントが始まってから1時間の場合 }else if(hour == 15){ time1 = "スタート!!"; //午後4時から午前7時59分までの場合 }else{ time1 = "本日は終了しました"; } //2つ目のイベント //午前8時から午後6時59分までの場合 if(hour >= 8 && hour <= 18){ //分単位で残り時間を計算 //concat()メソッドで文字列を連結 time2 = "あと".concat(String.valueOf((18-hour)*60+(60-minute))).concat("分"); 51 //イベントが始まってから1時間の場合 }else if(hour == 19){ time2 = "スタート!!"; //午後8時から午前7時59分までの場合 }else{ time2 = "本日は終了しました"; } //3つ目のイベント //午前8時から午後7時59分までの場合 if(hour >= 8 && hour <= 19){ time3 = "あと".concat(String.valueOf((19-hour)*60+(90-minute))).concat("分"); //午後8時から午後8時29分までの場合 }else if(hour == 20 && minute < 30){ time3 = "あと".concat(String.valueOf(30-minute)).concat("分"); //午後8時30分から午後8時40分までの場合 }else if(hour == 20 && minute >= 30 && minute <= 40){ time3 = "スタート!!"; //午後8時41分から午前7時59分までの場合 }else{ time3="本日は終了しました"; } loadLabel_CD1.setText(time1); //空ラベル time1 に文字列をセット loadLabel_CD2.setText(time2); //空ラベル time2 に文字列をセット loadLabel_CD3.setText(time3); //空ラベル time3 に文字列をセット } 8.おわりに 本システムを制作したことにより、Java の技術が身に付いた。Java の勉強を しながら実際に自分でプログラミングをし、システムを開発するのは難しかっ たが、同時にやりがいも得ることができた。Java は引数の受け渡しが複雑だっ たり、クラスごとに互換性がないとうまく動作しなかったりしたので、エラー を頻繁に出してしまった。また、スクラッチパッドの書き込みと読み込みが上 手くできずに苦労することもあった。自身の勉強不足により何度も行き詰るこ とがあったが、参考書を丹念に読んだり、情報を収集したりしてなんとかプロ 52 グラムを完成させることができた。 理想のプログラムに近づくためには何よりも努力が一番大切だと感じた。何 があっても諦めなければ、自分の努力次第で可能性が広がることを学んだ。 9.参考文献と参考URL (1)布留川英一 『i アプリゲーム開発テキストブック 日コミュニケーションズ、2007 年 903i/703i 対応』 毎 (2)NTT ドコモ ホーム>サービス・機能>作ろう i モードコンテンツ>ツ ー ル ダ ウ ン ロ ー ド > DoJa5.0 プ ロ フ ァ イ ル 向 け i ア プ リ 開 発 ツ ー ル 、 http://www.nttdocomo.co.jp/service/imode/make/content/iappli/tool/doja/doja5 0/index.html 2009 年 1 月 26 日 (3)SDN Home > Products & Technologies > Java Technology > Java Platform, Standard Edition (Java SE) > Core Java > J2SE 1.4.2 > Java2 SDK, Standard Edition v 1.4.2(J2SE) の ダ ウ ン ロ ー ド 、 http://java.sun.com/j2se/1.4.2/ja/download.html 2009 年 1 月 26 日 (4)索引、 http://www.ep.u-tokai.ac.jp/~nakazato/API/504i/base/jguide504_apiref02051 7/javadoc/index-all.html 2009 年 1 月 26 日 (5)i アプリプログラミング、http://www.geocities.jp/java_iappli/ 2009 年 1 月 26 日 53