2013-12-03 6 views
0

У меня есть программа, которая имеет несколько JPanels в JFrame. В определенные моменты видна только одна панель [setVisible (true)], а все остальные - [setVisible (false)]. Я бы хотел, чтобы музыка была воспроизведена, когда JPanel видна, но пауза, когда это не так. У меня есть класс, который воспроизводит звукJPanels and Playing music

public class AudioPlay extends Thread { 

private String filename; 
private Position curPosition; 

private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb 

enum Position { 
    LEFT, RIGHT, NORMAL 
}; 

public AudioPlay(String wavfile) { 
    filename = wavfile; 
    curPosition = Position.NORMAL; 
} 

public AudioPlay(String wavfile, Position p) { 
    filename = wavfile; 
    curPosition = p; 
} 

public void run() { 
    while(true){ 
     File soundFile = new File(filename); 
     if (!soundFile.exists()) { 
      System.err.println("Wave file not found: " + filename); 
      return; 
     } 

     AudioInputStream audioInputStream = null; 
     try { 
      audioInputStream = AudioSystem.getAudioInputStream(soundFile); 
     } catch (UnsupportedAudioFileException e1) { 
      e1.printStackTrace(); 
      return; 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
      return; 
     } 

     AudioFormat format = audioInputStream.getFormat(); 
     SourceDataLine auline = null; 
     DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); 

     try { 
      auline = (SourceDataLine) AudioSystem.getLine(info); 
      auline.open(format); 
     } catch (LineUnavailableException e) { 
      e.printStackTrace(); 
      return; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return; 
     } 

     if (auline.isControlSupported(FloatControl.Type.PAN)) { 
      FloatControl pan = (FloatControl) auline 
        .getControl(FloatControl.Type.PAN); 
      if (curPosition == Position.RIGHT) 
       pan.setValue(1.0f); 
      else if (curPosition == Position.LEFT) 
       pan.setValue(-1.0f); 
     } 

     auline.start(); 
     int nBytesRead = 0; 
     byte[] abData = new byte[EXTERNAL_BUFFER_SIZE]; 

     try { 
      while (nBytesRead != -1) { 
       nBytesRead = audioInputStream.read(abData, 0, abData.length); 
       if (nBytesRead >= 0) 
        auline.write(abData, 0, nBytesRead); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return; 
     } finally { 
      auline.drain(); 
      auline.close(); 
     } 
    } 
} 

} 

Таким образом, в каждом классе расширяет JPanel и имеет Аудиоспектакли в качестве параметра. Когда JPanel сначала создается, вызывает метод start(). Но потом я постоянно воспроизводил все аудиофайлы.

Может ли кто-нибудь показать мне JPanel, который остановит метод start() одного из этих классов AudioPlay, в то время как JPanel не будет виден?

EDIT

Итак, у меня была идея, и играл немного, и теперь я могу получить его, чтобы играть звук только тогда, когда его видно! Он воспроизводит предыдущие панели музыки в течение секунды или двух после того, как его видимость отключена, но по большей части делает то, что нужно! Для тех, кто нуждается в этом, это обновленный.

import java.io.File; 
import java.io.IOException; 

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.FloatControl; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.SourceDataLine; 
import javax.sound.sampled.UnsupportedAudioFileException; 
import javax.swing.JPanel; 

public class AudioPlay extends Thread { 

private String filename; 
private Position curPosition; 
JPanel panel; 

private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb 

enum Position { 
    LEFT, RIGHT, NORMAL 
}; 

public AudioPlay(String wavfile, JPanel panel) { 
    filename = wavfile; 
    curPosition = Position.NORMAL; 
    this.panel = panel; 
} 

public AudioPlay(String wavfile, Position p, JPanel panel) { 
    filename = wavfile; 
    curPosition = p; 
    this.panel = panel; 
} 

public void run() { 
    while(true){ 
     File soundFile = new File(filename); 
     if (!soundFile.exists()) { 
      System.err.println("Wave file not found: " + filename); 
      return; 
     } 

     AudioInputStream audioInputStream = null; 
     try { 
      audioInputStream = AudioSystem.getAudioInputStream(soundFile); 
     } catch (UnsupportedAudioFileException e1) { 
      e1.printStackTrace(); 
      return; 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
      return; 
     } 

     AudioFormat format = audioInputStream.getFormat(); 
     SourceDataLine auline = null; 
     DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); 

     try { 
      auline = (SourceDataLine) AudioSystem.getLine(info); 
      auline.open(format); 
     } catch (LineUnavailableException e) { 
      e.printStackTrace(); 
      return; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return; 
     } 

     if (auline.isControlSupported(FloatControl.Type.PAN)) { 
      FloatControl pan = (FloatControl) auline 
        .getControl(FloatControl.Type.PAN); 
      if (curPosition == Position.RIGHT) 
       pan.setValue(1.0f); 
      else if (curPosition == Position.LEFT) 
       pan.setValue(-1.0f); 
     } 

     auline.start(); 
     int nBytesRead = 0; 
     byte[] abData = new byte[EXTERNAL_BUFFER_SIZE]; 
     try { 
      while (nBytesRead != -1) { 
       if(this.panel.isShowing()){ 
        nBytesRead = audioInputStream.read(abData, 0, abData.length); 
        if (nBytesRead >= 0) 
         auline.write(abData, 0, nBytesRead); 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return; 
     } finally { 
      auline.drain(); 
      auline.close(); 
     } 
    } 
} 

} 

ответ

0

Вы можете попробовать ComponentListener хотя он никогда не работал для меня