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 文件,如果需要,您可以调整代码。一个聪明的实现甚至可以从同一线程驱动多个音频文件。
播放音频文件:
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 something
}
} 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");
我试图解决这个问题,但我从来没有找到一个对我有效的解决办法。问题是我得到了关于Base64Encoder的警告。没有Base64Encoder还有其他方法可以做到这一点吗? 代码:
当我使用JDK 1.7.0在OS X上编译Spring JDBC源代码时,我收到了以下警告: 如何在编译期间抑制警告消息? 我已经知道并使用Java的@SuppressWarning注释。我正在寻找它的具体用途来抑制我所描述的警告。 我的问题是,在这一行代码中: “ValueGoesher”应该用什么来代替? 编辑:各位,我知道最好避免导致警告的代码。通常这是我的方法。然而,我在这里编译第三方代码
你有什么想法吗? 让我们说它不是关键的,只是一个警告,但我担心它可能来自于一些错误,这些错误不是直接表现出来的,而是以某种方式引起的,让我们称之为,这种附带效应…
问题内容: 当我使用JDK 1.7.0在OS X上编译Spring JDBC源代码时,收到以下警告: 如何在编译期间禁止显示警告消息? 我已经知道并使用Java的@SuppressWarning注释。我正在寻找特定的用法来抑制我所描述的警告。 我的问题特别是在以下代码行中: 应该用“ valuegoeshere”替换什么? 编辑:人们,我知道最好避免导致警告的代码。通常这就是我的方法。但是,我在这
当我尝试用Ant构建我的项目时,我得到了以下警告。我的build.xml ist是从Eclipse自动生成的: 在Eclipse中,该行没有错误,如果删除该行(是hibernate的注释),错误将出现在另一行中。错误似乎出现在java文件的第一行。 编辑: 第二行生成警告。但是,如果删除该行,下一行将生成相同的警告。如果删除所有注释,最后一行将生成警告。