2012-05-19 2 views
1

Я вставил фоновый звук в свою программу, используя AudioInputStream.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, она не работает.

Во время компиляции и запуска нет ошибки.

Какая ошибка в моем коде?

ответ

4

Ваша переменная 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 свое собственное действие. Это заслуживает не меньше.

+0

Хорошо, я попробую. Могу ли я узнать, в чем разница между '.isActive()' и '.isRunning()'? – Chin

+0

@ AnnonyNewbie: Я не знаю разницы, если честно, поскольку я никогда не использовал Java Audio. Сожалею. –

+0

Тогда о проблеме моего кода, поэтому я должен объявить метод вроде 'setAudio()' и 'getAudio'? – Chin

 Смежные вопросы

  • Нет связанных вопросов^_^