【问题标题】:CheckBox sound stoppingCheckBox 声音停止
【发布时间】:2016-12-17 07:19:19
【问题描述】:

当我单击该框时音乐可以正常工作,但是当我再次单击它时音乐不会停止。然后,如果我再次单击未选中的框,音乐将再次播放,一次播放 2 次!请帮我停止音乐!

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;

【问题讨论】:

  • 请分享AudioPlayer的代码
  • 在哪里,我该怎么做?
  • @DarkKnight import sun.audio.AudioPlayer; 是 (Oracle) JRE 内部的一个未记录的(&“无可用源”)类。 OP:不要使用这些类。请改用javax.sound.sampled 包中的Clip
  • Then if i click on the unchecked box again, the music plays again so 2 times at once! 好吧,每次您单击复选框时,您都会创建一个new AudioStream(...) 我怀疑您应该只创建一个。然后你使用 AudioStream 的方法来开始/停止音乐。阅读 API。
  • @MatějPospíšil 让我知道我的解决方案是否适合您。

标签: java swing audio checkbox javasound


【解决方案1】:

假设您已经正确地创建了一个 Clip,并且可以访问它和一个反映 JCheckBox 状态的布尔值(比如 isSelected),那么下面的简单代码应该可以工作:

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

这可以包含在 JCheckBox 的 ActionListener 中。

有关使用 Clips 的更多信息可以在 Java 教程的“音频线程”中找到,其中包含有关 Clips here 的详细信息。如果您搜索如何使用 Java Clip,其他地方会有更清晰的示例。官方的 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 可能是更好的选择。可以在here 找到为 Swing 按钮编写侦听器的示例。

【讨论】:

  • 会有很大帮助的。
猜你喜欢
  • 2012-07-14
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多