2014-04-23 90 views
0

我試圖尋找類似的問題,但找不到。我不知道當按鈕被釋放時我怎麼可以阻止我的聲音,而且我不知道如何逐一循環聲音,當我按住它時,再次播放前一個循環仍在播放時,聲音正在成爲從∞聲音的循環。如何在按下按鈕時循環聲音並在釋放時停止?

下面的代碼:

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

} 

任何人都可以幫助我解決這個問題?

回答

0

我不知道當按鈕被釋放時我怎麼能阻止我的聲音?

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

太棒了!非常感謝你! – EiKei

+0

歡迎您.. – Braj

0

當我拿着它再次上場,而上一個循環仍在播放按鈕。

這是因爲每keyPress您正在創建一個新的File對象。這應該避免。

要停止聲音: 我會添加一個boolean參數playsound方法。根據傳遞的參數,我會調用clip.start()clip.stop()(超類DataLine有一個停止方法)。 致電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(); 

    } 

} 
+0

好的,感謝您的解釋,我能做什麼,關於文件?如何導入文件而不創建對象? – EiKei

+0

我建議每次調用keypressed時都不要創建一個** new **文件。
所以你可以做一些這樣的事情:創建一個靜態變量
File f = new File(「loopbase/loop1 /」+ e.getKeyChar()+「.wav」
這個聲明就像String b []和Action [ ]的動作
然後在按鍵調用
playSound(f);我很抱歉,我在這個論壇上是新的,仍然在學習如何正確編輯 – rational

+0

我試圖這樣做,但它沒有奏效,我試圖向Clip []數組添加聲音,但是在執行過程中出現內存不足錯誤:\ – EiKei

相關問題