CheckBox声音停止

问题描述:

当我点击该框时,音乐工作得很好,但是当我再次点击它时,音乐不会停止。然后,如果我再次点击未经检查的框,音乐再次播放,所以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)。 –

假设你已经正确创建的剪辑片段,并可以访问它和反映对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

好吧我试过这里剪辑,但它做同样的事情 –