在Java中使用AudioPlayer

在我的swing应用程序中,我使用一个类来点击鼠标时发出声音。 我遇到的问题是,当我打电话给class级时,声音会被播放一次,当突然看到另一个按钮时,它就不会播放声音。 我尝试延迟我的代码,但仍然无法正常工作。 它与线程有关吗? 我不擅长线程所以请告诉我如何做到这一点。 我使用的代码如下,

package utilities; import java.applet.AudioClip; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; import sun.audio.AudioData; import sun.audio.AudioPlayer; import sun.audio.AudioStream; import sun.audio.ContinuousAudioDataStream; public class Tone {` File wavFile = new File("sounds/Windows Default.wav"); URL urlClick = Tone.class.getResource("/sounds/WindowsDefault.wav"); AudioClip sound; public void sound() { AudioStream as = null; try { InputStream in = this.getClass().getResourceAsStream("/sounds/WindowsDefault.wav"); as = new AudioStream(in); AudioData data = as.getData(); // Create ContinuousAudioDataStream. ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data); //System.out.println(as.getLength()); AudioPlayer.player.start(cas); //System.out.println(urlClick); //sound = Applet.newAudioClip(urlClick); //this.wait(1000); for(int i =0;i<100000;i++){ double k = Math.pow(i, 5); if(i==99999){ AudioPlayer.player.stop(cas); return; } } // sound.play(); String relativeDirectory = System.getProperty("user.dir"); System.out.println(relativeDirectory); } catch (IOException ex) { Logger.getLogger(Tone.class.getName()).log(Level.SEVERE, null, ex); } finally { try { as.close(); } catch (IOException ex) { Logger.getLogger(Tone.class.getName()).log(Level.SEVERE, null, ex); } } } public static void main(String[] args) { Tone tone = new Tone(); tone.sound(); System.out.println("done"); } } 

–EDIT–我使用continuousaudiostream的原因是因为当我使用这个aleast听到一些声音时声音根本没有发生。 即使我使用AudioStream问题就在那里..

1)最好不要使用隐藏的类/ api – 因为你已经阅读了你在其他问题中得到的链接:-)

2)在开始/重新打开之前停止/关闭已经运行的声音,在公共场合如下:

 Clip clip; private void doPlay(final String url) { try { stopPlay(); AudioInputStream inputStream = AudioSystem .getAudioInputStream(getClass().getResourceAsStream(url)); clip = AudioSystem.getClip(); clip.open(inputStream); clip.start(); } catch (Exception e) { stopPlay(); System.err.println(e.getMessage()); } } private void stopPlay() { if (clip != null) { clip.stop(); clip.close(); clip = null; } } 

(注意:完全关闭仅用于说明,优化逻辑以加载一次然后再次停止/启动)

看起来ContinuousAudioDataStream只在文件结束后才重置,因此可能是在发生这种情况之前发生了第二次按钮点击。 也许尝试重置流