我正在尝试实现当我作为我的程序时开始的背景音乐并继续循环当我从netbeans运行程序时它完美地工作,但是当我运行jar文件时我无法使它工作。任何想法如何使其与我当前的实现一起工作?感谢
在主要方法中,我称之为:
Sound sound = new Sound();
if (sound.setSong("resources\\music.wav")) { sound.start(); }
这是声音类:
public class Sound extends Thread {
private AudioStream as;
private AudioPlayer p;
private boolean playback;
public void run() { startPlayback(); }
public boolean setSong(String b) {
try {
File a = new File(System.getProperty("user. dir") + "\\src\\" + b);
if (a.exists()) {
// HERE THERE IS THE IMPLEMENTATION WHEN RUN FROM NETBEANS
as = new AudioStream(new FileInputStream(a));
return true;
} else { // HERE SHOULD BE THE JAR FILE IMPLEMENTATION
as = new AudioStream(this.getClass().ge tResourceAsStream(b));
return true;
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Error in loading\n" + ex.getMessage());
}
return false; }
public void startPlayback() {
playback = true;
p.player.start(as);
try {
do { } while (as.available() > 0 && playback);
if (playback) { startPlayback(); }
} catch (IOException ex) {
Logger.getLogger(Sound.class.g etName()).log(Level.SEVERE, null, ex);
}
}
public void stopPlayback() { playback = false; p.player.stop(as); } }
答案 0 :(得分:0)
当应用程序打包为jar时,声音文件可能不在“resources”文件夹中 - 它可能位于类路径的根目录中。所以,你应该做sound.setSong("music.wav")
。
除非您特别想首先尝试从文件系统加载文件,否则您可能不需要这样做 - NetBeans应将其添加到类路径中。
另外,请注意Java String中的反斜杠是转义序列,而不是路径分隔符。 因此,如果您要指定路径,则为“/ a / b”, 不 “\ a \ b”
答案 1 :(得分:0)
在这两种情况下(netbeans和jar),你应该可以调用
as = new AudioStream(this.getClass().getResourceAsStream("/resources/" + b));