服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jbuilder制作音频播放程序



  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个类,如下表:

类名myframeaudioplaygifpaneltest
功能界面gui播放音频文件存放gif图片的面板测试类

  1.生成application的gui

  首先,利用jbuilder的wizard自动生成一个带有菜单栏的application,然后在frame中添加控件。如下所示:

类型jlistjbuttonjbuttonjbuttonjbutton jfilechooser
名称jlist1jbtnbackjbtnplayjbtnstopjbtnforwardfilechooser
功能播放列表后退播放停止前进打开文件对话框

  在按钮的下面添加jlist作为播放列表,为了避免画面的单调,我们在右边添加一幅gif,为了便于对gif进行管理,我们为它制作了一个面板,构成gifpanel类。完成后的界面如下图所示:

jbuilder制作音频播放程序



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

扫描关注微信公众号