2016-12-15 193 views
0

當我點擊該框時,音樂工作得很好,但是當我再次點擊它時,音樂不會停止。然後,如果我再次點擊未經檢查的框,音樂再次播放,所以2次一次!請幫助我停止音樂!CheckBox聲音停止

import java.awt.event.WindowEvent; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JOptionPane; 
import sun.audio.AudioPlayer; 
import sun.audio.AudioStream; 
private void jCheckBox1ActionPerformed(java.awt.event.ActionEvent evt) {           
    InputStream inputStream = getClass().getResourceAsStream("panda - desiigner (donald trump remix).au"); 
    AudioStream audioStream = null; 

try { 
    audioStream = new AudioStream(inputStream); 
} catch (IOException ex) { 
    Logger.getLogger(kekFrame.class.getName()).log(Level.SEVERE, null, ex); 
} 
int check; 
if(jCheckBox1.isSelected() == true){ 
    check = 1; 
} else { 
    check = 0; 
} 
switch (check) { 
    case 1 : AudioPlayer.player.start(audioStream); 
      System.out.println("Music has started playing"); 
      break; 
    case 0 : AudioPlayer.player.stop(audioStream); 
      System.out.println("Music has stopped playing"); 
      break; 
} 



}           

/** 
* @param args the command line arguments 
*/ 


// Variables declaration - do not modify      
private javax.swing.JCheckBox jCheckBox1; 
+0

請同時分享AudioPlayer的代碼 –

+0

在哪裏,我該怎麼做? –

+1

@DarkKnight'import sun.audio.AudioPlayer;'是(Oracle)JRE內部沒有記錄的(&'no source available')類。 OP:不要使用這些類。改爲使用'javax.sound.sampled'包中的['Clip'](http://docs.oracle.com/javase/8/docs/api/javax/sound/sampled/Clip.html)。 –

回答

0

假設你已經正確創建的剪輯片段,並可以訪問它和反映對JCheckBox的狀態的布爾(isSelected,說了),下面簡單的代碼應該工作:

if (isSelected) 
    { 
     clip.setFramePosition(0); 
     clip.start(); 
    } 
    else 
    { 
     clip.stop(); 
    } 

這可以包含在JCheckBox的ActionListener中。

有關使用剪輯的更多信息,請參見Java教程的「音頻線程」,其中包含有關剪輯here的詳細信息。如果您搜索如何使用Java剪輯,其他地方會有更清晰的示例。正式的Java音頻教程強調背景和高層次的概念,犧牲了實際的例子,這讓我們剛剛起步的人難以閱讀。

sun.audio.AudioPlayer不再支持!即使它在PC上正常工作,也無法保證它可以在其他系統上工作。不幸的是,這是一個過時的代碼示例存在於博客和非官方教程中的情況,隨着語言的發展以及編寫教程的各方不更新或維護他們的帖子,這可能會發生很多。


爲了迴應OP的請求,下面是一個適用於我的JavaFX GUI的示例。我不再使用Swing,也不想回去。

在其中JavFX Button正在修建的代碼:

btnPlay = new Button("Play"); 
    btnPlay.setOnAction(e -> handlePlay(e)); 

這調用下面的方法:

private void handlePlay(ActionEvent e) 
{ 
    if (!isPlaying) 
    { 
     clip.setFramePosition(0); 
     clip.start(); 
     ((Button)e.getSource()).setText("STOP"); 
     isPlaying = true; 
    } 
    else 
    { 
     clip.stop(); 
     ((Button)e.getSource()).setText("PLAY"); 
     isPlaying = false; 
    } 
} 

在此代碼,IsPlaying模塊是一個實例變量,在這種情況只是告訴我們按鈕是打開還是關閉。當按鈕仍處於「播放」狀態時,剪輯可能會很好地播放到最後並自行停止播放。當剪輯完成播放時,需要連線LineListener以使按鈕切換回來。

也許你可以適應上面的東西有用嗎?在我看來,JCheckBox的選擇是可疑的,JToggleButton可能是更好的選擇。爲Swing按鈕編寫監聽器的示例可以找到here

+0

我可以請求完整的代碼嗎? –

+0

它會幫助很多。 –

+0

好吧我試過這裏剪輯,但它做同樣的事情 –