【问题标题】:AudioInputStream() does not stopAudioInputStream() 不会停止
【发布时间】:2012-05-19 16:09:00
【问题描述】:

我已使用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 按钮时,它不起作用。

编译运行没有错误。

我的代码有什么错误?

【问题讨论】:

    标签: java swing audio io jmenuitem


    【解决方案1】:

    您的 AudioInputStream 变量 audioInputStream 和 Clip 变量 clip3 是该方法的本地变量。您尝试停止的对象与当前正在播放的对象不同。

    让它们成为类字段,在调用它们的方法之前检查它们是否不为空,如果你试图停止当前播放的对象,请不要创建新对象,你应该没问题。

    类似:

    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 自己的动作。它值得拥有。

    【讨论】:

    • 好的,我试试看。我能知道.isActive().isRunning()有什么区别吗?
    • @AnonyNewbie:说实话,我不知道有什么区别,因为我从未使用过 Java 音频。对不起。
    • 那么关于我的代码的问题,所以我应该声明一个类似setAudio()getAudio的方法?
    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多