Java 如何一次播放一个.wav文件?

Java 如何一次播放一个.wav文件?,java,audio,javax.sound.sampled,Java,Audio,Javax.sound.sampled,我想创建一个程序,在按下某个按钮时播放某个.wav文件。例如,JButton b1、b2、b3分别播放“Music1.wav”、“Music2.wav”和“Music3.wav”,但一次只能播放一个wav文件。这就是我所做的,它有问题停止较早的剪辑,并导致两个或更多的wav文件同时播放 ... //imports the important stuff public class WAVButtons extends JFrame implements ActionListener {

我想创建一个程序,在按下某个按钮时播放某个.wav文件。例如,
JButton b1、b2、b3
分别播放
“Music1.wav”
“Music2.wav”
“Music3.wav”
,但一次只能播放一个wav文件。这就是我所做的,它有问题停止较早的剪辑,并导致两个或更多的wav文件同时播放

...   //imports the important stuff 
public class WAVButtons extends JFrame implements ActionListener
{
    private JButtons b1, b2, b3;
    private File[] sounds;

    public WAVButtons()
    {
         try
         {
               sounds = new File[]
                        {new File("Music1.wav"),
                         new File("Music2.wav"),
                         new File("Music3.wav")};
         }catch(Exception e)
         {
         }
         b1 = new JButton("play Music1");
         b2 = new JButton("play Music2");
         b3 = new JButton("play Music3");
         b1.addActionListener(this);
         b2.addActionListener(this);
         b3.addActionListener(this);
         ... //codes for GUI
    }

    public void actionPerformed(ActionEvent ae)
    {
         if(ae.getSource() == b1)
         { 
              playMusic1(true);
              playMusic2(false);
              playMusic3(false);
         }
         else if(ae.getSource() == b2)
         {
              playMusic1(false);
              playMusic2(true);
              playMusic3(false);
         }
         else if(ae.getSource() == b3)
         {
              playMusic1(false);
              playMusic2(false);
              playMusic3(true);
         }
    }

    public void playMusic1(boolean action)
    {
        try
        {
            AudioInputStream stream = AudioSystem.getAudioInputStream(sounds[0]);
            AudioFormat format = stream.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, format);
            Clip clip = (Clip)AudioSystem.getLine(info);
            clip.open(stream);
            if(action)
            {
                clip.start();
                clip.loop(Clip.LOOP_CONTINUOUSLY);
            }
            else
                clip.stop();
        }catch (Exception e)
        {
        }
    }

    ... //playMusic2() and playMusic3() looks exactly the same as playMusic1(), except that the
        //parameter of AudioSystem.getAudioInputStream() is sounds[1] and sounds[2], respectively.
}
当调用playMusic1(true)后再调用playMusic1(false)时,第二个调用将创建剪辑的新实例,然后停止新实例。第一次调用创建的第一个实例将继续运行。您应该保留对剪辑的引用,以便它可以停止。我还冒昧地删除了你的重复代码

Clip clip;

public void actionPerformed(ActionEvent ae)
{
     if(ae.getSource() == b1)
     { 
          playMusic(0);
     }
     else if(ae.getSource() == b2)
     {
          playMusic(1);
     }
     else if(ae.getSource() == b3)
     {
          playMusic(2);
     }
}

public void playMusic(int clipNum)
{
    try
    {
        if (clip != null)
            clip.stop();

        if (action)
        { 
            AudioInputStream stream = AudioSystem.getAudioInputStream(sounds[clipNum]);
            AudioFormat format = stream.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, format);
            clip = (Clip)AudioSystem.getLine(info);
            clip.open(stream);
            clip.start();
            clip.loop(Clip.LOOP_CONTINUOUSLY);
        }
    }catch (Exception e)
    {
    }
}