在java程序中添加背景音乐 – 已删除的API警告?

import javax.swing.*; import sun.audio.*; import java.awt.event.*; import java.io.*; public class Sound { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(200,200); JButton button = new JButton("Clcik me"); frame.add(button); button.addActionListener(new AL()); frame.show(true); } public static class AL implements ActionListener{ public final void actionPerformed(ActionEvent e){ music(); } } public static void music(){ AudioPlayer MGP = AudioPlayer.player; AudioStream BGM; AudioData MD; ContinuousAudioDataStream loop = null; try{ BGM = new AudioStream(new FileInputStream("backgroundmusic.wav")); MD = BGM.getData(); loop = new ContinuousAudioDataStream(MD); }catch(IOException error){ error.printStackTrace(); } MGP.start(loop); } } 

当我运行代码时,编译器将显示警告。 我该如何避免?

 Sound.java:22: warning: AudioPlayer is internal proprietary API and may be removed in a future release Sound.java:23: warning: AudioStream is internal proprietary API and may be removed in a future release Sound.java:24: warning: AudioData is internal proprietary API and may be removedin a future release Sound.java:25: warning: ContinuousAudioDataStream is internal proprietary API and may be removed in a future release Sound.java:27: warning: AudioStream is internal proprietary API and may be removed in a future release Sound.java:29: warning: ContinuousAudioDataStream is internal proprietary API and may be removed in a future release Note: Sound.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. 7 warnings 

首先,您应该使用javax.sound.sampled包中的类来避免编译器警告。 其次,在使用这些类时,您还需要从后台的线程中驱动它们。

这是一段时间前写的(现在六七年)。 现在有比在循环中睡觉更好的方法,但它适用于快速简单的wav文件,如果需要,您可以调整代码。 一个聪明的实现甚至可以从同一个线程驱动几个音频文件。

播放一个wav文件:

 import java.io.InputStream; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.DataLine; public class SoundThread extends Thread { private final String resource; public static void play(String resource) { Thread t = new SoundThread(resource); t.setDaemon(true); t.start(); } public SoundThread(String resource) { this.resource = resource; } @Override public void run() { Clip clip = null; try { InputStream in = SoundThread.class.getClassLoader().getResourceAsStream(resource); if(in != null) { AudioInputStream stream = AudioSystem.getAudioInputStream(in); AudioFormat format = stream.getFormat(); DataLine.Info info = new DataLine.Info(Clip.class, format); clip = (Clip) AudioSystem.getLine(info); clip.open(stream); clip.loop(0); do { try { Thread.sleep(100); } catch(InterruptedException iex) { // bad form on my part here. Should do somethinging } } while(clip.isRunning()); } } catch (Exception e) { x.printStackTrace(System.out); } finally { try { if(clip != null) { clip.close(); } } catch(Exception x) { x.printStackTrace(System.out); } } } } 

如何调用它的示例:

 SoundThread.play("resources/cashregister6.wav");