如何在Swing GUI中加入音效

摘要:Swing是单线程的,播放音效是一个耗时的过程,所以不要在主线程中直接播放音效,否则会阻塞界面的响应。正确的方法应该是在子线程中播放音效,尽可能地提高界面的体验。
在练习Swing做GUI时,我们可能希望在组件操作过程中加入一些音效,这样可以使整个程序有更加丰富的元素。
需要注意的是Swing是单线程的,播放音效是一个耗时的过程,所以不要在主线程中直接播放音效,否则会阻塞界面的响应。正确的方法应该是在子线程中播放音效,尽可能地提高界面的体验。

自定义一个线程类,我把它命名为WaveThread,继承Thread,代码如下:
public class WaveThread extends Thread {
    private String filename;
    private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb

    public WaveThread(String wavfile) {
        filename = wavfile;
    }

    public void run() {
        AudioInputStream audioInputStream = null;
        SourceDataLine auline = null;
        URL url = Thread.currentThread().getContextClassLoader()
                             .getResource(filename);
        try {
            File soundFile = new File(url.toURI());
            audioInputStream = AudioSystem.getAudioInputStream(soundFile);
            AudioFormat format = audioInputStream.getFormat();
            DataLine.Info info = new DataLine.Info(SourceDataLine.class
                    , format);
            auline = (SourceDataLine) AudioSystem.getLine(info);
            auline.open(format);
            auline.start();

            int nBytesRead = 0;
            byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
            while (nBytesRead != -1) {
                nBytesRead = audioInputStream.read(abData, 
                          0, abData.length);
                if (nBytesRead >= 0)
                    auline.write(abData, 0, nBytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (auline != null) {
                auline.drain();
                auline.close();
            }
        }
    }
}

代码其实很简单,调用Java的AudioInputStream来读取音效文件,然后通过SourceDataLine组件来播放。有需要的童鞋可以直接复制使用,使用示例如下:
new WaveThread("merge.wav").start();

不过可能有童鞋在使用的过程中出现NullPointException这样的异常,原因就是找不到merge.wav文件。merge.wav是一个音效文件,调用上面的代码前需要把merge.wav文件放在项目的类路径下,因为线程是通过寻找类路径来加载音效文件,
URL url = Thread.currentThread().getContextClassLoader()
                  .getResource(filename);
try {
    File soundFile = new File(url.toURI());
......

关于怎样获取项目的类路径可以参考《获取当前项目的类路径

版权说明:如无特殊说明,文章均为本站原创,如需转载请注明出处

本文标题:如何在Swing GUI中加入音效

本文地址:http://www.wolfbe.com/detail/201609/368.html

本文标签: swing gui java classloader

相关文章

感谢您的支持,朗度云将继续前行

扫码打赏,金额随意

温馨提醒:打赏一旦完成,金额无法退还,请谨慎操作!

扫二维码 我要反馈 回到顶部