程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JBuilder制作音頻播放程序

JBuilder制作音頻播放程序

編輯:關於JAVA

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方法就可以進行設置了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved