Java 如何将声音融入节目

Java 如何将声音融入节目,java,swing,audio,jmf,Java,Swing,Audio,Jmf,因此,我尝试使用另一个类合并声音,以便以后在游戏中使用它,但我不知道如何在不出错的情况下执行任何操作,这就是我目前得到的 主类(Project1.class) 这是实际播放音乐的课程(music.class) 如果有人能帮助我,我将非常感激,我从来没有做过声音,也不知道如何做,对此我非常困惑,我会在button ActionListener类中加入什么内容,这样,只有当我按下按钮时,音乐才会开始,然后在4秒钟后停止?如果我把线程。睡眠(4000);在音乐课上,它开始播放音乐,等待4秒钟,停止,然

因此,我尝试使用另一个类合并声音,以便以后在游戏中使用它,但我不知道如何在不出错的情况下执行任何操作,这就是我目前得到的

主类(Project1.class)

这是实际播放音乐的课程(music.class)

如果有人能帮助我,我将非常感激,我从来没有做过声音,也不知道如何做,对此我非常困惑,我会在button ActionListener类中加入什么内容,这样,只有当我按下按钮时,音乐才会开始,然后在4秒钟后停止?如果我把线程。睡眠(4000);在音乐课上,它开始播放音乐,等待4秒钟,停止,然后显示按钮


如果有人能帮我了解一下音频,或者其他更简单的方法。我将非常感激

单击按钮时,在单独的线程中播放音乐怎么样?因此,action listener的actionPerformed将启动线程播放音乐。

音乐首先播放的原因是您在构造函数中有play方法。因此:

public static void main(String[] args) throws Exception{

    Music m = new Music(); // ****** Music plays here
    m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    m.setSize(300,300);
    JButton button = new JButton("Click here for 4 second part of the music");
    m.add(button);
    button.addActionListener(new AL());
    m.setVisible(true);


}
然后在你设置好尺寸之后,等等

main方法中的所有内容都应该在Music()的构造函数中。您的音乐播放代码应该在ActionListener类AL中

您还需要确保不占用事件线程。因此,在ActionListener中,您将有如下内容:

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    String filename = "/Users/seb/Documents/workspace(NormalJava)/practs/res/backgroundMusic.wav";

    InputStream in = new FileInputStream(new File(filename));
    AudioStream audioStream = new AudioStream(in);
    AudioPlayer.player.start(audioStream);

    Thread.sleep(4000);

    AudioPlayer.player.stop(audioStream);
  }
}

我认为你的actionListener应该播放音乐,而不是构造器。因此,声音是在活动中播放的,而不是在施工中播放的。我认为马克·伯纳德有一个很好的观点。

不,不应该,请阅读马赫什的答案Acharya@mKorbel他的回答没有解释整个问题。我给了他一个答案,问他为什么在按钮出现之前先播放音乐。然后我向他展示了正确的方法,包括在自己的线程中运行声音。。
public static void main(String[] args) throws Exception{

    Music m = new Music(); // ****** Music plays here
    m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    m.setSize(300,300);
    JButton button = new JButton("Click here for 4 second part of the music");
    m.add(button);
    button.addActionListener(new AL());
    m.setVisible(true);


}
SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    String filename = "/Users/seb/Documents/workspace(NormalJava)/practs/res/backgroundMusic.wav";

    InputStream in = new FileInputStream(new File(filename));
    AudioStream audioStream = new AudioStream(in);
    AudioPlayer.player.start(audioStream);

    Thread.sleep(4000);

    AudioPlayer.player.stop(audioStream);
  }
}