【问题标题】:How to loop a sound while button is pressed and stop when released?如何在按下按钮时循环声音并在释放时停止?
【发布时间】:2014-04-23 15:49:51
【问题描述】:

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

代码如下:

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( );
      }
    }

}

谁能帮我解决这个问题?

【问题讨论】:

    标签: java swing audio jbutton keylistener


    【解决方案1】:

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

    您可以使用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();            
            ...        
    }
    

    【讨论】:

      【解决方案2】:

      当我按住按钮时,它会在上一个循环仍在播放时再次播放。

      这是因为对于每个keyPress,您都在创建一个新的File 对象。应该避免这种情况。

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

      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( );
      
          }
      
      }
      

      【讨论】:

      • 好的,感谢您的解释,关于文件我该怎么办?如何在不创建对象的情况下导入文件?
      • 我建议不要在每次调用 keypressed 时创建 new 文件。
        所以你可以这样做: 做一个静态变量
        File f = new File("loopbase/loop1/"+e.getKeyChar()+".wav"
        这个声明是就像 String b[] 和 Action[] 动作。
        然后在按键调用
        playSound(f); 对不起,我是这个论坛的新手,还在学习如何正确编辑。
      • 我尝试这样做,但没有成功,我正在尝试将声音添加到 Clip[] 数组,但在执行过程中出现内存不足错误:\
      猜你喜欢
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      相关资源
      最近更新 更多