当我点击该框时音乐工作正常,但当我再次点击它时音乐不会停止。然后,如果我再次单击未选中的复选框,音乐将再次播放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;
答案 0 :(得分:0)
假设您已正确创建了一个Clip,并且可以访问它和反映JCheckBox状态的布尔值(isSelected,比如说),则以下简单代码应该有效:
if (isSelected)
{
clip.setFramePosition(0);
clip.start();
}
else
{
clip.stop();
}
这可以包含在JCheckBox的ActionListener中。
有关使用剪辑的更多信息,请参阅Java Tutorial的“音频线程”,其中包含有关剪辑here的详细信息。如果您搜索如何使用Java Clip,则其他地方有更清晰的示例。官方的Java音频教程强调了背景和高级概念,但却牺牲了实际的例子,imho,这使我们刚刚开始的人难以阅读。
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。