2014-01-09 6 views
1

У меня есть приложение Java с двумя кнопками: Start and Stop.Потеря контроля над моим приложением при чтении аудиофайла

Когда я нажимаю кнопку «Пуск», я читаю аудиофайл. Но есть проблема. Когда я читаю музыку, невозможно щелкнуть по другой кнопке. Я потерял контроль над своим приложением, пока не будет прочитан весь аудиофайл. Поэтому я не могу остановить чтение, нажав кнопку.

Я думаю, что мне нужно использовать поток, но у меня есть некоторые трудности, чтобы понять, как работает поток.

Вы можете мне помочь?

Вот моя серверная:

public class ServerBoard extends JFrame 
{ 
    private TCPServer tcpserver; 
    private Sound sound; 
    private JTextArea messagearea; 
    private JButton startserver; 
    private JButton playmusic; 
    private JButton stopmusic; 


    /** CONSTRUCTEUR **/ 
    public ServerBoard(int l, int h) 
    { 
     ... 
    } 

    /** Initialisation de la fenetre **/ 
    public void initialize() 
      { 
     ... 
    } 


/********************************************************************************************** 
************************************** ADD PANELS ************************************** 
**********************************************************************************************/ 
    private JPanel createPanelEast() 
    { 
     ... 

     return panelEast; 
    } 


/********************************************************************************************** 
************************************* ADD LISTENERS ************************************ 
**********************************************************************************************/ 
    private class ServerBoardListener implements ActionListener 
    {  
     public void actionPerformed(ActionEvent e) 
     { 
      String namebutton=e.getActionCommand().trim(); 

      if(namebutton.equals("START SERVER")) 
      { 
       startServer(); 
      } 

      else if(namebutton.equals("PLAY MUSIC")) 
      { 
       playMusic(); 
      } 

      else if(namebutton.equals("STOP MUSIC")) 
      { 
       stopMusic(); 
      } 
     } 
    } 


/********************************************************************************************** 
****************************************** METHODS ****************************************** 
**********************************************************************************************/ 
    // METHODE POUR DEMARRER LE SERVEUR 
    public void startServer() 
    { 
     // Une fois clique, on desactive le bouton 
     startserver.setEnabled(false); 

     // On cree l'objet OnMessageReceved demande par le constructeur de TCPServer 
     tcpserver=new TCPServer(new TCPServer.OnMessageReceived() 
        { 
      public void messageReceived(String message) 
      { 
       messagearea.append(message); 
      } 
     }); 
     tcpserver.start(); 
    } 

    // METHODE POUR LIRE UN FICHIER AUDIO 
    public void playMusic() 
    { 
     System.out.println("lecture de son"); 
     try 
     { 
      Sound sound = new Sound("C:/Documents and Settings/cngo/Bureau/Stage-Save/TCPIP_AndroidJava/TCPIP_V6_Sound/OpeningSuite.mp3"); 
      System.out.println("playing : " + sound.isPlaying()); 
      sound.play(); 
      System.out.println("playing : " + sound.isPlaying()); 
     } 
     catch (Exception e){e.printStackTrace();} 

    } 

    // STOP LA MUSIQUE 
    public void stopMusic() 
    { 
     System.out.println("arret de la musique"); 
     try 
     { 
      sound.stop(); 
     } 
     catch (Exception e) {e.printStackTrace();} 
    } 
} 

Вот мой Sound.class:

public class Sound 
{   
    private boolean isPlaying = false; 
    private AdvancedPlayer player = null; 

    public Sound(String path) throws Exception 
    { 
     InputStream in = (InputStream)new BufferedInputStream(new FileInputStream(new File(path))); 
     player = new AdvancedPlayer(in); 
    } 

    public boolean isPlaying() 
    { 
     return isPlaying; 
    } 

    public void play() throws Exception 
    { 
     if (player != null) 
     { 
      isPlaying = true; 
      player.play(); 
     } 
    } 

    public Sound(String path,PlaybackListener listener) throws Exception 
    { 
     InputStream in = (InputStream)new BufferedInputStream(new FileInputStream(new File(path))); 
     player = new AdvancedPlayer(in); 
     player.setPlayBackListener(listener); 
    } 

    public void play(int begin,int end) throws Exception 
    { 
     if (player != null) 
     { 
      isPlaying = true; 
      player.play(begin,end); 
     } 
    } 

    public void stop() throws Exception 
    { 
     if (player != null) 
     { 
      player.stop(); 
      isPlaying = false; 

     } 
    } 
} 

Благодаря вам заранее за вашу помощь.

+2

Слишком много кода, отвечая закрытыми глазами: вы читаете файл в разделе «Диспетчер событий», тем самым замораживая весь графический интерфейс. Используйте SwingWorker для загрузки файла. –

+1

кажется 'sound.play()' не является асинхронным. – UmNyobe

ответ

1

Используйте Java Sound на основе Clip. Пример кода можно увидеть на Java Sound info. page. Он запускается в daemon Thread, поэтому не будет блокировать Thread Dispatch Thread.

..если я понимаю, что звук Java предназначен только для дискретизированных аудиоданных?

MP3 is сэмплированные аудиоданные! Учитывая, что это MP3, вы должны прочитать всю информацию о звуке Java. страница, в которой четко объясняется, как обеспечить поддержку MP3 в JSE.

Мне нужно что-то легкое, минималистичное для моего приложения, которое позволяет мне читать большие аудиофайлы и/или аудиопоток.

OK. Если он большой, вам понадобится BigClip. Либо это, либо SwingWorker, как предложено в других комментариях.

+0

Спасибо за ваш ответ @AndrewThompson. Но, если я понимаю, Java Sound предназначен только для дискретизированных аудиоданных? Мне нужно что-то легкое, действительно минималистичное для моего приложения, которое позволяет мне читать большие аудиофайлы и/или аудиопоток. – Tofuw

+0

См. Редактирование для ответа. –

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