0

我正在尝试实现当我成为我的程序时开始的背景音乐并继续循环当我从 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); } }
4

2 回答 2

0

当应用程序打包为 jar 时,声音文件可能不在“资源”文件夹中 - 它可能在类路径的根目录中。所以,你可能应该这样做sound.setSong("music.wav")

除非您特别想首先尝试从文件系统加载文件,否则您可能不需要这样做 - NetBeans 应该将它添加到类路径中。

另外,请注意 Java 字符串中的反斜杠是转义序列,而不是路径分隔符。所以,如果你想指定一个路径,它是“/a/b”,而不是“\a\b”

于 2012-12-04T18:31:44.527 回答
0

在这两种情况下(netbeans 和 jar),您应该可以调用

as = new AudioStream(this.getClass().getResourceAsStream("/resources/" + b));
于 2012-12-04T18:52:17.923 回答