如何将声音合并到一个程序中

时间:2014-11-07 19:41:13

标签: java swing audio jmf

所以我试图使用另一个类合并声音,以便我以后可以在游戏中使用它,但我不知道如何做任何事情而不会出错,这就是我所做的到目前为止

主类(Project1.class)

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;



public class Project1 {



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

        Music m = new Music();
        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);


    }

    public static class AL implements ActionListener{

        public final void actionPerformed(ActionEvent e){
            //What do I put here so that I could play the Music from the other class?
        }
    }
}

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

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import javax.swing.JButton;
import javax.swing.JFrame;

import sun.audio.*;
import sun.*;


public class Music extends JFrame{

    private JButton button;

    public Music() throws Exception {
    super("The title");



    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类中放置什么,这样只有当我按下它时才会启动音乐,然后在4秒后停止?如果我把Thread.sleep(4000);在音乐课上,然后它开始音乐,等待4秒,停止然后向我显示按钮

所以,如果有人能帮助我了解音频,或者可能是另一种更简单的方法。我非常感激!

3 个答案:

答案 0 :(得分:1)

首先播放音乐的原因是因为你在构造函数中有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);
  }
}

答案 1 :(得分:0)

单击按钮时,在单独的线程中播放音乐怎么样?因此动作侦听器的actionPerformed将启动线程来播放音乐。

答案 2 :(得分:0)

我说你的actionListener应该播放Music而不是构造函数。因此,声音是在不在建的情况下播放的。我认为MarkBernard有一个非常好的观点。