繁体   English   中英

如何在按下按钮时循环播放声音并在释放时停止播放?

[英]How to loop a sound while button is pressed and stop when released?

我试图搜索与此类似的问题,但找不到。 我不知道在释放按钮时如何停止声音,而且我也不知道如何仅一个一个地循环播放声音,当我按住按钮时,它会在上一个循环仍在播放的同时再次播放声音从∞声音变成一个循环。

这是代码:

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Component;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.net.MalformedURLException;
import java.util.ArrayList;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class test {

    String  b[]={"Q","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M"};
    Action[] actions = new AbstractAction[26];

    public test() throws Exception {

        JFrame frame = new JFrame();

        JButton[] buttons = new JButton[26];

        for(int i = 0; i < buttons.length; i++) {
            buttons[i] = new JButton(b[i]);
            buttons[i].setSize(80, 80);
            buttons[i].addKeyListener(new KeyAdapter(){

                public void keyPressed(KeyEvent e){
                        System.out.println(e.getKeyChar());
                        playSound(new File("loopbase/loop1/"+e.getKeyChar()+".wav"));
                }

                public void keyReleased(KeyEvent e){

                }

            });
            frame.add(buttons[i]);
        }

        JPanel contentPane = (JPanel)frame.getContentPane();

        frame.setLayout(new GridLayout(3, 5, 5, 3));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                try {
                    new test();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

    }

    public void playSound(File soundName)
    {
      try 
      {
       AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundName.getAbsoluteFile( ));
       Clip clip = AudioSystem.getClip( );
       clip.open(audioInputStream);
       clip.start( );
      }
      catch(Exception ex)
      {
        System.out.println("Error with playing sound.");
        ex.printStackTrace( );
      }
    }

}

有人可以帮我解决这个问题吗?

释放按钮时我不知道如何停止声音?

您可以使用DataLine#stop()停止剪辑。 只需保留最后播放的剪辑的参考,然后在下面的行中调用即可停止它。

clip.stop();

注意:您可以将其存储在static变量中的某个位置。


样例代码:

private static Clip clip;

...
public void keyReleased(KeyEvent e) {
    if (clip != null) {
        clip.stop();
    }
}
...

public void playSound(File soundName) {        
        ...
        clip = AudioSystem.getClip();            
        ...        
}

当我按住Button时,它将再次播放,而上一个循环仍在播放。

这是因为对于每个keyPress您都将创建一个新的File对象。 那应该避免。

停止声音:我会在playsound方法中添加一个boolean参数。 根据所传递的参数,我将调用clip.start()clip.stop() (超类DataLine具有stop方法)。 调用playsound(filename,false); keyReleased

public void playSound(File soundName , boolean start)
{

    try 
    {

        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundName.getAbsoluteFile( ));
        Clip clip = AudioSystem.getClip( );
        clip.open(audioInputStream);
        if(start == true)
        clip.start();
        else
        clip.stop();

    }
    catch(Exception ex)
    {

        System.out.println("Error with playing sound.");
        ex.printStackTrace( );

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM