java - 如何停止另一个班级的连续声音循环?
问题描述
我的代码有声音循环问题。声音本身在另一个类中,我想通过单击另一个类中的 jbutton 来停止它。
声音类中的代码:
public Sound() {
try {
URL sound = this.getClass().getClassLoader().getResource("sound.wav");
AudioInputStream audioIn = AudioSystem.getAudioInputStream(sound);
Clip clip = AudioSystem.getClip();
clip.open(audioIn);
clip.start();
clip.loop(Clip.LOOP_CONTINUOUSLY);
}
catch (Exception e) {
e.printStackTrace();
}
}
我已经尝试了很多方法来通过单击另一个类(ActionListener)中的 jbutton 来停止声音,但似乎没有任何效果。有任何想法吗?
编辑:我忘了说我也尝试使用 jbutton 将声音方法放入同一个类中,但也没有让它起作用。(以下代码)
public void sound() {
try {
URL sound = this.getClass().getClassLoader().getResource("sound.wav");
AudioInputStream audioIn = AudioSystem.getAudioInputStream(sound);
Clip clip = AudioSystem.getClip();
clip.open(audioIn);
clip.start();
clip.loop(Clip.LOOP_CONTINUOUSLY);
} catch (Exception e) {
e.printStackTrace();
}
}
编辑2:
JButton playB = new JButton("Play");
playB.setBounds(192, 350, 500, 100);
playB.setFont(new Font("Arial", Font.PLAIN, 80));
playB.setForeground(Color.GREEN);
menu.add(playB);
playB.setOpaque(false);
playB.setContentAreaFilled(false);
playB.setBorderPainted(false);
playB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clip.stop();
}
});
clip.stop()
显然不在那里工作。
解决方案
首先,Clip
应该是一个实例变量。不要在你的方法中声明它。在班级级别声明它。然后,您可以有一个公共的、专用的类方法来引用 Clip 并停止它。
当你这样做(使其成为一个实例变量)时,将播放剪辑成为它自己的单独方法也将是一个改进。当您初始化剪辑然后以单个方法启动它时,必须在剪辑开始播放之前将整个文件读入内存。如果剪辑是一个大文件,这可能会导致严重的延迟。
推荐的做法是首先加载剪辑,然后将它们保存在内存中,直到播放它们。如果您不想将这些数据保存在内存中,最好使用SourceDataLine
.
推荐阅读
- android - 适用于 Android 的 Google Drive API 上传文件但无法同步到远程
- python - 如何防止输入在python 3中开始新行
- ios - Swift - 如何自动大写 UIButton 的标签?
- laravel - vuejs 中的 V-for 循环不返回任何内容
- sql-server - 更新#table并插入
- node.js - 表达 rest api 密钥身份验证
- crystal-lang - 我怎样才能改变它以不耗尽内存?
- github - 提交期间是否有从 GitHub 到 Cloud Foundry 的 CI/CD 管道
- kubernetes - Kubernetes优化部署文件
- python - 如何在 APIView 中的 Django REST API 中进行分页?