せっかく、時計がカウントダウン表示されるようになったので、時間になったらアラーム音が鳴って、メッセージウィンドウが表示されるようにしてみます。
残念ながら、現状のJavaFX自体には、サウンド再生のサポートはありません(アニメーションと同期させてサウンドを再生するなどの応用を考えると、JavaFXでサウンドの再生やアニメーションとの同期などを簡潔に記述できるといいのですが…)。そこで、Javaのプログラムで音の再生とメッセージの表示を行うクラスを作成し、JavaFXのプログラムからそれを呼び出すことにしました。
NetBeansでJavaアプリケーションのプロジェクト(名前は任意)を作成し、パッケージ名を「timer」、ファイル名を「Sound.java」として、クラスファイルを作成します(パッケージ名は、作成済みのJavaFXファイルで指定したパッケージ名にあわせました。ファイル名は、その名前でJavaFXプログラムから参照しさえすれば、何でもかまいません)。
サウンドの再生には、Java Appletなどで使うAudioClipクラスを利用します。ただ、Appletを作るわけではないので、java.applet.AppletクラスのクラスメソッドnewAudioClip()でサウンドファイルを読み込むようにします。このメソッドの引数には、サウンドファイルのURLを指定しないといけないのですが、それでは不便なので、作成するクラスの基底クラスclassからgetResource()メソッドを呼びだして、サウンドファイルのURLを取得し、引数に指定します。
AudioClipを生成したら、あとは、そのplay()メソッドを呼び出してサウンドをワンタイム再生するか、loop()メソッドとstop()メソッドで繰り返し再生とその停止を行うようにします。私は、メッセージウィンドウの表示に先立ってサウンドの繰り返し再生を起動し、メッセージウィンドウが閉じられたら再生を停止するようにしました。
サウンドファイルのタイプとしては、「.au」ファイルと「.wav」ファイルのどちらも指定できます。自分のパソコンから好きな音のファイルを捜してきて(ネットワークからダウンロードしてもいいのですが、得体の知れないものは怖いので)、そのファイルを、作成するクラスの「.class」ファイルが出力されるディレクトリ(プロジェクトファイルの下の「build\classes\〈パッケージ名〉\」ディレクトリ)にコピーします(このとき、ファイル検索ウィンドウからファイルを持ってくるときは、ファイルの移動を行わないように注意してください。不用意にドラッグするとファイルが移動され、元の場所からなくなってしまいます)。私は、「TestMusic.wav」という、ちょっと軽快な音楽が演奏されるファイルを選びました。
メッセージウィンドウの表示には、おなじみのJOptionPane.showMessageDialog()を使用しました。showMessageDialog(VBのMsgboxに相当)は、ちょっとしたデバッグなどにも使えて便利なのですが、ダイアログウィンドウが必ずしもウィンドウスタックの最前面に表示されるわけではない、という難点(?)があります。この点については、同じように不便だと思われた方がいらしたようで、改造版を作られています。興味のある方は、Googleなどで検索してみてください。
作成したプロジェクトを構築して実行すると、サウンドが再生されて、メッセージダイアログが表示されます。
話が長くなってしまいましたので、今日はここまでです。最後にソースを載せておきます(いつものように、インデントが消えてしまっています。HTMLで編集すればいいのでしょうけれど…)。
package timer;
import java.applet.Applet;
import java.applet.AudioClip;
import javax.swing.JOptionPane;
public class Sound {
public static void alarm() {
AudioClip ac
= Applet.newAudioClip(Sound.class.getResource("TestMusic.wav"));
// ac.play();
ac.loop();
JOptionPane.showMessageDialog(null, "時間ですよ!", "警告!警告!", JOptionPane.WARNING_MESSAGE);
ac.stop();
}
public static void main(String[] args) {
Sound.alarm();
}
}
0 件のコメント:
コメントを投稿