Java是當今世界上非常流行的一種編程語言。它是由美國SUN計算機公司(Sun Microsystems, Inc.)所研究而成的,是一種為Internet發展而突破用戶端機器環境和CPU結構、寫一次即可在任何機器上執行(Write Once,Run Anywhere)的語言。
介紹完Java的特性與優勢後,我將開始介紹如何制作音頻播放程序。Java中有許多可以制作音頻播放的包和類,包括java.applet.AudioClip、com.sun.media.sound.JavaSoundAudioClip和javax.sound.midi.spi&javaw.sound.sampled.spi等,其中java.applet.AudioClip是從JDK1.0就存在的一個接口,其余的多個類是對這個接口的實現及豐富其功能。
下面,我將帶領大家利用com.sun.media.sound中的JavaSoundAudioClip類制作一個簡單的音頻播放器小程序。
我采用的是Borland公司的JBuilder,這是一個大型的Java集成開發環境。
我們共創建4個類,如下表:
類名 MyFrame AudioPlay GifPanel Test 功能 界面GUI 播放音頻文件 存放gif圖片的面板 測試類1.生成Application的GUI
首先,利用JBuilder的Wizard自動生成一個帶有菜單欄的Application,然後在Frame中添加控件。如下所示:
類型 JList JButton JButton JButton JButton JFileChooser 名稱 jList1 jBtnBack jBtnPlay jBtnStop jBtnForward fileChooser 功能 播放列表 後退 播放 停止 前進 打開文件對話框在按鈕的下面添加jList作為播放列表,為了避免畫面的單調,我們在右邊添加一幅gif,為了便於對gif進行管理,我們為它制作了一個面板,構成GifPanel類。完成後的界面如下圖所示:
2.構造AudioPlay類--音頻播放wav,注意異常處理
需要注意的是,當播放時,界面上的各個按鈕應當仍然可以對用戶的操作進行事件響應,所以至少需要兩個線程:一個控制歌曲的播放,另外一個對用戶事件進行響應。因此我們的AudioPlay類需要實現Runable接口,以使用多線程技術。根據JDK的解釋-JDK1.4.0,任何需要由線程執行的實例都應當實現Runable接口,而且由於我們只需要重寫run()方法和stop()方法,並給start()方法多態化,所以我們選擇實現Runable接口,這樣就可以不需要繼承Thread類而使用Thread類的實例來運行了。
package myplayer;
import com.sun.media.sound.JavaSoundAudioClip;
import java.io.*;
/**
* <p>Title: 音頻播放器</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author 放飛網
* @version 1.0
*/
public class AudioPlay
implements Runnable {
private JavaSoundAudioClip locate, warning;
protected boolean threadExit;
protected boolean stopped;
protected boolean playing;
Thread playerThread;
public AudioPlay() {
}
public void start(File f) {
playing = true;
stopped = false;
try {
FileInputStream ff = new FileInputStream(f);
locate = new JavaSoundAudioClip(ff);
}
catch (Exception e) {
System.out.println("error");
}
playerThread = new Thread(this);
playerThread.start();
}
public void run() {
if (playing) {
if (!stopped) {
if (locate == null)
System.out.print("nulll");
try {
locate.play();
System.out.print("test");
}
catch (Exception ee) {}
}
}
}
public void stop() {
stopped = true;
threadExit = true;
if (playing == true) {
playing = false;
locate.stop();
}
}
public void pause() {
if (playing == true) {
locate.stop();
}
}
}
3.設計文件過濾FileFilter
我們在使用Windows窗口打開文件時,經常會在文件類型的下拉框中看到多種相應的類型,這樣可以限定用戶所能夠選定的文件類型,也可以提高用戶選擇文件的速度,因為這樣將會只顯示相應類型的文件。
而Java中也提供了相應的類可以完成這一功能。
javax.swing.filechooser.FileFilter是一個定義好的抽象類,實現了文件過濾器的基本功能。它只有兩個方法:public abstract boolean accept(File f)和public abstract String getDescription()。由於文件過濾器在我們的程序中只用於Frame窗口中,所以鑒於封裝性,我們將其定義為MyFrame的內部類,如下所示:
// JScript source code
class WavFileFilter
extends javax.swing.filechooser.FileFilter {
/**
* 內部類
* wav文件過濾器,用於打開文件對話框
*/
String ext; // 文件擴展名
WavFileFilter(String ext) {
this.ext = ext;
}
/**
* 覆蓋性方法
* 參數所表示的文件是一個路徑名還是一個真實的文件名
* @param file 將給打開的文件
* @return 如果是路徑, 返回true, 否則返回false
*/
public boolean accept(File file) {
if (file.isDirectory()) // 是目錄,打開
return true;
String fileName = file.getName();
int index = fileName.lastIndexOf('.');
if (index > 0 && index < fileName.length() - 1) {
// 表示文件名稱不為".xxx"與"xxx."之類型
String extension = fileName.substring(index + 1).toLowerCase();
if (extension.equals(ext))
return true;
}
return false;
}
/**
* 給出對特定文件類型的描述
* @return 對文件類型的描述
*/
public String getDescription() { // 返回描述文件的說明字符串
if (ext.equals("wav"))
return "Wav File (*.wav)";
return "";
}
}
}
4.設置成Windows格式
Java具有跨平台的特性,同時造成它的界面也比較獨具“個性”。為了使界面更加美觀,符合大多數Windows平台使用者的習慣,我們可以在Frame中加上下面一段代碼:
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new Test(); // 初始化所要現實的窗體
}
catch(Exception e) {
e.printStackTrace();
}
其中,javax.swing.UIManager可以獲取和設置外觀。getSystemLookAndFeelClassName()方法會自動過去當前系統平台,在通過setLookAndFeel方法就可以進行設置了。