我已使用AudioInputStream
将背景音频插入程序中。
当我按On
时,将播放背景音频,而Off
将停止播放背景音频。
这是我的音频播放部分代码的一部分:
public void playSound(int i)
{
try
{
. //Others buttons sound
. //Others buttons sound
if(i == 3 || i == 4)
{
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("Background.wav"));
Clip clip3 = AudioSystem.getClip( );
clip3.open(audioInputStream);
if(i == 3)
{
clip3.loop(Clip.LOOP_CONTINUOUSLY);
clip3.start();
settingSubMenuItem3.setEnabled(false);
settingSubMenuItem4.setEnabled(true);
}
if(i == 4)
{
clip3.stop();
settingSubMenuItem3.setEnabled(true);
settingSubMenuItem4.setEnabled(false);
}
}
catch(Exception e)
{
System.out.println("Error with playing sound.");
e.printStackTrace();
}
}
这是
ButtonListener
部分:private class MenuItemListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == settingSubMenuItem3)
{
playSound(3);
}
if(e.getSource() == settingSubMenuItem4)
{
playSound(4);
}
}
}
当我按下
On
按钮时,我的代码可以播放音频,但是当我按下Off
按钮时,它不起作用。在编译和运行期间没有错误。
我的代码有什么错误?
最佳答案
您的AudioInputStream变量audioInputStream和Clip变量clip3在该方法中是本地的。您尝试停止的对象与当前正在播放的对象不同。
使它们成为类字段,在对它们调用方法之前检查它们是否不为null,如果要停止当前正在播放的对象,则不要创建新对象,并且应该没问题。
就像是:
public void playSound(int i) {
try {
// ...
if (i == 3 || i == 4) {
if (i == 3) {
audioInputStream = AudioSystem
.getAudioInputStream(new File("Background.wav"));
clip3 = AudioSystem.getClip();
clip3.open(audioInputStream);
clip3.loop(Clip.LOOP_CONTINUOUSLY);
clip3.start();
settingSubMenuItem3.setEnabled(false);
settingSubMenuItem4.setEnabled(true);
}
if (i == 4) {
if (clip3 != null && clip3.isActive()) {
clip3.stop();
settingSubMenuItem3.setEnabled(true);
settingSubMenuItem4.setEnabled(false);
}
}
}
} catch (Exception e) {
System.out.println("Error with playing sound.");
e.printStackTrace();
}
}
同样,使audioInputStream和clip3为非静态类字段。
顺便说一句,我将避免使用“魔术”数字(例如3和4),因为从现在起6个月内调试可能会变成魔鬼。而是给每个JButton自己的 Action 。它应得的。