| ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2007年07月29日 楽しいJava講座 - 初心者から達人へのパスポート vol.064 セルゲイ・ランダウ バックナンバー: http://www.flsi.co.jp/Java_text/ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ [このメールマガジンは、画面を最大化して見てください。] ======================================================== ◆ 01.グラフィックスのプログラミング ======================================================== 今回は、時計に目覚まし(アラーム)の機能をつけましょう。 普通の目覚まし時計では、目覚ましの機能を有効にするためには、 (1) アラームを鳴らしたい時刻を設定する。 (2) アラーム機能をオンにする。 という2つの操作を行います。 逆にアラームが鳴っているときにそれを止めるためには、 (3) アラーム機能をオフにする。 という操作を行います。 今回のプログラムでは、(1)の操作のためにアラームの時刻を JComboBoxを使って数値で設定する機能を追加し、(2)と(3)のため にJToggleButtonを使ってアラーム機能をオン/オフに設定する 機能を追加することにします。 (ただし、JToggleButtonはオン/オフがちょっとわかりにくいの で、わかりやすくしたい人は、代わりにJCheckBoxなどを使用して みてください。JCheckBoxの使用は演習にします。) そして、設定された時刻が来るまで監視し、時刻が来たらアラーム音 を鳴らすための処理を別のスレッドで実行するようにします。 このプログラムでは、アラーム音の音声ファイルが必要になりますが、 アラーム音のファイルは下記のホームページのvol.064の項に掲載し てありますので、ダウンロードしてください。 http://www.flsi.co.jp/Java_text/ アラーム音のファイル名はalarm01.auです。 ダウンロードしましたら、このファイルをJavaWorksフォルダーの中 のJStudy1フォルダーの中にコピーしてください。 ┌補足─────────────────────────┐ この.auという拡張子がついているファイルは、Sun audio file と呼ばれる(auはaudioの略)音声ファイルの形式です。圧縮さ れた音声ファイルなので、サイズがかなり小さくて済み、インター ネットなどでダウンロードして利用するのには都合がいい形式で すが、その代わりに音質が悪いという欠点があります。 └───────────────────────────┘ では、さっそくEclipseを起動して、作業を始めましょう。 jp.co.flsi.lecture.clockパッケージの中にアラーム関連の処理 を行うためのAlarmJPanelというクラスをJPanelのサブクラスとし て、ビジュアル・クラス(Visual Class)として作成しましょう。 つまり、パッケージ・エクスプローラーの中のJStudy1の中の jp.co.flsi.lecture.clockを右クリックし、 「新規」→「その他」→(「Java」の中の)「Visual Class」 を選択し「次へ」ボタンをクリックし、「名前」欄にAlarmJPanel と入力し、「Style」欄で(Swingの中の)Panelを選択しましょう。 また、「インターフェース」欄にRunnable(java.lang.Runnable) を追加しておきます。(これはclass文に「implements Runnable」 を指定することを意味します) そして、「Inherited abstract methods」にチェック・マークを 入れておいてから、「終了」ボタンをクリックします。 AlarmJPanelのVEエディターが開きましたら、最初にソース・コード のinitialize()メソッドの中の -------------------------------------------------------- this.setSize(300, 200); -------------------------------------------------------- の行を -------------------------------------------------------- this.setSize(130, 60); -------------------------------------------------------- に変更しておきましょう。 (もしくは、「プロパティー」ビューでsizeプロパティーの値を 130,60に変更するというやり方もあります。) なお、このパネルはサイズが小さいですから、あとでGUI部品を 貼り付けるときには、きれいに収まるように各GUI部品を小さめ に調整してください。 続いて、このパネルのLayoutManagerをnullにしておきましょう。 すなわちJPanelの画像を右クリックして「Set Layout」→「null」 を選択します。 また、このパネルの背景(background)を白色にしておきましょう。 パネルの画像の中をクリックして選択状態にし、「プロパティー」ビュー の中のbackgroundプロパティーの値をColor.white(「Java Property Editor」 の「Named Colors」タブでwhiteを選択する)にしておきましょう。 では、このパネルに、以下のようにGUI部品を貼り付けていきましょう。 (1) アラームの時刻設定の説明書き用にJLabelを貼り付けましょう。 Bean NameはjLabelAlarmTimeSetにしておきましょう。 そのtextプロパティーを「アラームの時刻:」にしておきましょう。 サイズを適当に調整しておいてください。 (2) その下に、JComboBoxを貼り付けましょう。これは、アラームの時刻 のうち時(hour)を設定するためのものです。 Bean NameはjComBoxAlarmHHにしておきましょう。 サイズを適当に調整しておいてください。 (3) その右隣にJLabelを貼り付けましょう。 Bean NameはjLabelHourにしておきましょう。 そのtextプロパティーを「時」にしておきましょう。 サイズを適当に調整しておいてください。 (4) その右隣にJComboBoxを貼り付けましょう。これは、アラームの時刻 のうち分(minute)を設定するためのものです。 Bean NameはjComBoxAlarmMMにしておきましょう。 サイズを適当に調整しておいてください。 (5) その右隣にJLabelを貼り付けましょう。 Bean NameはjLabelMinuteにしておきましょう。 そのtextプロパティーを「分」にしておきましょう。 サイズを適当に調整しておいてください。 (6) その下にJToggleButtonを貼り付けましょう。 Bean NameはjToggleButtonAlarmOnOffにしておきましょう。 サイズを適当に調整しておいてください。 (7) その左隣にJLabelを貼り付けましょう。 Bean NameはjLabelAlarmにしておきましょう。 そのtextプロパティーを「アラーム:」にしておきましょう。 サイズを適当に調整しておいてください。 続いて、jComBoxAlarmHHとjComBoxAlarmMMの2つのJComboBoxに対して、 表示する値を以下のようにして設定しましょう。 まずjComBoxAlarmHHのほうですが、生成されたgetJComBoxAlarmHH()メ ソッドのソース・コードは -------------------------------------------------------- private JComboBox getJComBoxAlarmHH() { if (jComBoxAlarmHH == null) { jComBoxAlarmHH = new JComboBox(); jComBoxAlarmHH.setBounds(new Rectangle(4, 23, 44, 17)); } return jComBoxAlarmHH; } -------------------------------------------------------- というふうになっていますね。(ただし、数値は設定したサイズによっ て異なります。) これを次のように編集しましょう。 -------------------------------------------------------- private JComboBox getJComBoxAlarmHH() { if (jComBoxAlarmHH == null) { jComBoxAlarmHH = new JComboBox(); jComBoxAlarmHH.setBounds(new Rectangle(4, 23, 44, 17)); for (int i = 0; i < 24; i++) { jComBoxAlarmHH.addItem(Integer.toString(i)); } } return jComBoxAlarmHH; } -------------------------------------------------------- 何を編集したのかわかりますね。これでjComBoxAlarmHHには0時から23時 までの時刻が選択できるようになりますね。 続いてjComBoxAlarmMMのほうですが、生成されたgetJComBoxAlarmMM()メ ソッドのソース・コードは -------------------------------------------------------- private JComboBox getJComBoxAlarmMM() { if (jComBoxAlarmMM == null) { jComBoxAlarmMM = new JComboBox(); jComBoxAlarmMM.setBounds(new Rectangle(66, 23, 45, 17)); } return jComBoxAlarmMM; } -------------------------------------------------------- というふうになっていますね。(ただし、数値は設定したサイズによっ て異なります。) こちらも同様に次のように編集しましょう。 -------------------------------------------------------- private JComboBox getJComBoxAlarmMM() { if (jComBoxAlarmMM == null) { jComBoxAlarmMM = new JComboBox(); jComBoxAlarmMM.setBounds(new Rectangle(66, 23, 45, 17)); for (int i = 0; i < 60; i++) { jComBoxAlarmMM.addItem(Integer.toString(i)); } } return jComBoxAlarmMM; } -------------------------------------------------------- これでjComBoxAlarmMMには0分から59分までの時刻が選択できるように なりますね。 では、次に設定された時刻になったらアラーム音を鳴らすためのコード を書きましょう。 これは、1分ごとに時刻をチェックして、現在時刻が設定された時刻と 等しければアラーム音を鳴らすという処理をループで行います。 (目覚まし機能はそんなに正確である必要はありませんから、1分ごと のチェックで充分だと考えます。) 前回お話したように、このようなループの処理は別のスレッドで行う 必要がありますから、run()メソッドに記述します。 その前に、アラーム機能がオンになっているかオフになっているかを 示すフィールドとして、下記のようなフィールドを追加しておいて ください。 -------------------------------------------------------- private boolean alarmMode = false; -------------------------------------------------------- また、アラーム音のオブジェクトを入れるフィールドとして下記の ようなフィールドを追加しておいてください。 -------------------------------------------------------- private AudioClip audioClip = null; -------------------------------------------------------- (AudioClipはjava.appletパッケージにはいっています。) さらに、このフィールドにアラーム音のオブジェクトをセットしたり、 逆に取り出したりするために次のようなsetter(setメソッド)、 getter(getメソッド)を追加しておきましょう -------------------------------------------------------- public void setAudioClip(AudioClip audioClip) { this.audioClip = audioClip; } public AudioClip getAudioClip() { return audioClip; } -------------------------------------------------------- また、現在の時刻がアラームの設定時刻と等しいかどうかをチェック するための下記のようなメソッドも追加しておきましょう。 -------------------------------------------------------- private boolean isAlarmTime() { GregorianCalendar newTime = new GregorianCalendar(); int alarmHH, alarmMM; try { alarmHH = Integer.parseInt((String)(getJComBoxAlarmHH().getSelectedItem())); alarmMM = Integer.parseInt((String)(getJComBoxAlarmMM().getSelectedItem())); } catch (NumberFormatException e) { return false; } if (newTime.get(Calendar.HOUR_OF_DAY) == alarmHH && newTime.get(Calendar.MINUTE) == alarmMM) { return true; } return false; } -------------------------------------------------------- では、run()メソッドのプログラミングをしましょう。AlarmJPanelの ビジュアル・クラスの作成時に、「Inherited abstract methods」に チェック・マークを入れておきましたから、下記のようなrun()メソッ ドのスタブが作られているはずです。 -------------------------------------------------------- public void run() { // TODO 自動生成されたメソッド・スタブ } -------------------------------------------------------- これを次のように編集しましょう。 -------------------------------------------------------- public void run() { if (audioClip == null) return; while (alarmMode) { if (isAlarmTime()) { while (alarmMode) { getAudioClip().play(); try { Thread.sleep(1000); } catch (InterruptedException e) { } } } try { Thread.sleep(60000); } catch (InterruptedException e) { } } } -------------------------------------------------------- 続いて、このスレッドを起動するための下記のようなメソッドを 追加しましょう。 -------------------------------------------------------- public void alarmThreadStart() { alarmMode = true; Thread aThread = new Thread(this); aThread.start(); } -------------------------------------------------------- また、このスレッドを停止するための下記のようなメソッドを追加 しましょう。 -------------------------------------------------------- public void alarmThreadStop() { alarmMode = false; } -------------------------------------------------------- 最後に、jToggleButtonAlarmOnOffのトグル・ボタンがオンにされた ときにalarmThreadStart()メソッドを呼び出し。オフにされたときに alarmThreadStop()が呼び出されるようにプログラミングしましょう。 「Java Beans」ビューの中のjToggleButtonAlarmOnOffを右クリックし、 「Events」→「actionPerformed」を選択します。 getJToggleButtonAlarmOnOff()メソッドのソース・コードの中に下記 のコードが自動生成されていますから、 -------------------------------------------------------- jToggleButtonAlarmOnOff.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed() } }); -------------------------------------------------------- これを下記のように編集しましょう。 -------------------------------------------------------- jToggleButtonAlarmOnOff.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { if (jToggleButtonAlarmOnOff.isSelected()) alarmThreadStart(); else alarmThreadStop(); } }); -------------------------------------------------------- 以上で、AlarmJPanelは完成です。 次に、このAlarmJPanelをClockAppletに貼り付ける作業に移ります。 ClockAppletのVEエディターを開きましょう。 前回ClockJPanelを貼り付けたときに右側を空けていましたね。そこ にAlarmJPanelを貼り付けましょう。 パレットの「Choose Bean」を選択し、「Choose a Bean」ウインドウ でAlarmJPanelを入力して「OK」ボタンをクリックし、アプレットの 右側の空いているところをクリックします。 Bean NameはalarmJPanelのままにしましょう。 適切な位置に貼り付いていない場合は、ドラッグして位置を調整しま しょう。 さらに、生成されたgetAlarmJPanel()メソッドの中の位置を設定する コードを次のように数値を編集してピッタリした位置に設定しましょ う。 -------------------------------------------------------- alarmJPanel.setBounds(new Rectangle(170, 0, 130, 60)); -------------------------------------------------------- では、続いてClockAppletのinit()メソッド -------------------------------------------------------- public void init() { this.setSize(300, 200); this.setContentPane(getJContentPane()); getClockJPanel().clockStart(); } -------------------------------------------------------- を編集して、次のようにアラーム音のファイルを取り込んで AlarmJPanelに渡すコードを追加しましょう。 -------------------------------------------------------- public void init() { this.setSize(300, 200); this.setContentPane(getJContentPane()); getClockJPanel().clockStart(); AudioClip audioClip = getAudioClip(getDocumentBase(), "alarm01.au"); getAlarmJPanel().setAudioClip(audioClip); } -------------------------------------------------------- getAudioClip()メソッドはAppletのメソッドで、指定された場所 (ここではgetDocumentBase()メソッドを呼び出すことによって、 アプレットが置かれているHTMLの場所と同じ場所を指定している) から指定されたファイル名(ここではalarm01.au)の音声ファイル を取り出して、AudioClip型のオブジェクトにしてくれます。 そこで、そのAudioClipオブジェクトをAlarmJPanelのsetAudioClip() メソッドを呼び出すことによって、AlarmJPanelに渡しています。 以上で、アラームの機能は完成です。 ClockAppletを起動してテストしてみてください。 アラームの時刻とセットしてアラームをオンにすれば、ちゃんとセット した時刻にアラーム音が鳴りますね(ただし、1分おきにチェックして いるので、タイミングが悪ければ最大1分ほどアラームが遅れることが あります。)。 また、アラーム音が鳴っているときにアラームをオフにすれば、ちゃん と音が止まりますね。 では、今回はここまでにします。なお、今回作成したアプレットはホー ムページにも掲載しておきますので、完成したアプレットの動きを確認 したい人は下記ホームページのvol.064の項目から実行してみてください。 http://www.flsi.co.jp/Java_text/ 何か、わからないところがありましたら、下記のWebページまで質問を お寄せください。 (続く) ======================================================== ◆ 02.文法解説 [アプレット(5)] ======================================================== [アプレット(5)「アプレットの情報」] AppletのgetAppletInfo()メソッドを実装(オーバーライド)する ことにより、アプレットビューアでアプレットを起動したときに アプレットの情報を表示させることができます。 たとえば、アプレットのソース・コードの中に -------------------------------------------------------- public String getAppletInfo() { return "Title: ClockApplet \n" + "Author: Sergei Landau, 2007 \n" + "A sample alarm clock."; } -------------------------------------------------------- というようにgetAppletInfo()メソッドをコーディングしておくと、 このreturn文で返す内容が、アプレットビューアの「アプレット」 メニューの中の「情報」というメニュー項目を選択することによっ て表示されます。 このとき同時にパラメーターの情報も表示されます。これは、Applet のgetParameterInfo()メソッドを実装(オーバーライド)することに より表示されます。 たとえばvol.059の「アプレットのパラメーター」のサンプルに合わ せた情報にすると、 -------------------------------------------------------- public String[][] getParameterInfo() { String[][] info = { {"rectwidth", "positive integer", "The width of the rectangular. Default is 100."}, {"rectheight", "positive integer", "The height of the rectangular. Default is 50."} }; return info; } -------------------------------------------------------- というようなコードを書いておけばいいのです。 それぞれ、パラメーター名、型の種類、説明、という3種類の情報を パラメーターごとに書いておきます。 これらの情報を提供するコードは、アプレットの一般ユーザーには 役に立ちませんが、開発者にとっては覚書として利用することがで きます。 (続く) 以上、今回は ┌───────────────────────────┐ ・アプレットでの音声ファイルの取り込み(getAudioClip()メソッドの使用)方法 ・音声ファイルからの音の鳴らし方(AudioClipのplay()メソッド) ・指定された時刻に処理を実行するためのプログラミング ・アプレット情報のコーディング方法 └───────────────────────────┘ を学習しました。 では、また来週。 (続く) ================================================ ◆ 03.演習問題 ================================================ 今回のアラーム機能のオン/オフの設定に使ったGUI部品がJToggleButton ではちょっとわかりにくいので、JToggleButtonの代わりにJCheckBoxを使用 してプログラムを修正してみてください。 やり方がわからない人は、下記Webページにて質問をお寄せください。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ★ホームページ: http://www.flsi.co.jp/Java_text/ ★このメールマガジンは 「まぐまぐ(http://www.mag2.com)」 を利用して発行しています。 ★バックナンバーは http://www.flsi.co.jp/Java_text/ にあります。 ★このメールマガジンの登録/解除は下記Webページでできます。 http://www.mag2.com/m/0000193915.html ★このメールマガジンへの質問は下記Webページにて受け付けて います。わからない所がありましたら、どしどしと質問をお寄 せください。 http://www.flsi.co.jp/Java_text/ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ Copyright (C) 2007 Future Lifestyle Inc. 不許無断複製 |