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方法就可以进行设置了。
闽公网安备 35060202000074号