2017-02-16 10 views
0

Так что я пытаюсь создать виджет музыкального плеера, но имею проблемы с воспроизведением нескольких выбранных песен по одному. Я надеялся, что усиленный цикл будет перебирать все выбранные файлы и воспроизводить их по одному, но одновременно воспроизводит все песни. Есть ли лучший способ сделать эту работу?Как я могу получить доступ к одному файлу и манипулировать им одновременно в методе getSelectedFiles()?

FileInputStream FIS; 
BufferedInputStream BIS; 

public Player player; 
public long pauseLocation; 
public long songTotalLength; 
public boolean playState = false; 
public String fileLocation; 

public boolean playState(){ 
    return playState; 
} 

public void setPlayState(boolean value){ 
    this.playState = value; 
} 
public void select() { 

    FileNameExtensionFilter filter = new FileNameExtensionFilter("MP3 Files", "mp3", "mpeg3"); 
    JFileChooser chooser = new JFileChooser("D:\\MAIN_DIV\\Music"); 
    chooser.addChoosableFileFilter(filter); 
    chooser.setMultiSelectionEnabled(true); 
    int returnVal = chooser.showOpenDialog(null); 

    if (returnVal == JFileChooser.APPROVE_OPTION) { 
     stop(); 

     if (playState == false) { 
      File[] selectedFile = chooser.getSelectedFiles(); 
      for (File x : selectedFile) { 
       String song = x + ""; 
       String name = chooser.getSelectedFile().getName(); 
       display.setText(name); 
       play(song); 
      } 
     } 
    } 
} 

public void play(String path){ 

    playState(); 
     try { 
      FIS = new FileInputStream(path); 
      BIS = new BufferedInputStream(FIS); 
      player = new Player(BIS); 
      songTotalLength = FIS.available(); 
      fileLocation = path + ""; 
      //System.out.println(path); 
     } catch (FileNotFoundException | JavaLayerException ex) { 

     } catch (IOException ex) { 

     } 



    new Thread(){ 
     @Override 
     public void run(){ 

      if(playState == false){ 

       try { 
         player.play(); //play from start or resume 


        if (player.isComplete() && MusicPlayer.count==1){ 
         play(fileLocation); 


        } 
        if (player.isComplete()){ 
         MusicPlayer.display.setText(""); 
        } 

       } catch (JavaLayerException ex) { 

       } 
      }  
     } 
    }.start(); 
    setPlayState(false); 

} 
+1

Ничего не существует для петли как таковой. Проблема заключается в «игре». Из вашего вопроса неясно, что делает игра, но она, вероятно, создает фоновый процесс для воспроизведения песни и возвращается во время воспроизведения песни, позволяя петле продолжать собирать новые песни. Если вы покажете исходный код 'play', мы можем вам помочь. Дополнительно: что такое плейлист? Не удалось ли запустить плейлист после цикла for? –

+0

Хорошо. Итак, это исходный код для игры. Я удалил класс списка воспроизведения из кода (все еще работаю над этим). Может быть, теперь я могу получить дополнительную помощь. –

+0

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

ответ

0

Это является причиной проблемы:

new Thread() { ... } .start(); 

создает поток, который работает в фоновом режиме, чтобы играть песню. Метод play возвращается во время воспроизведения песни, позволяя for -loop продолжать собирать новые песни.

Он должен работать должным образом, если вы просто держите тело своего run -методом. Таким образом, воспроизведение песни происходит последовательно и play блоков до player.play();.

+0

Держите тело моего метода запуска? Я не думаю, что это действительно понимаю. –

+0

Глава метода - это декларативная часть (т. Е. Public void run()), тело метода - это все, что находится между его фигурными фигурными скобками. Для начала удалите весь код потока ('new Thread() {...} .start();') и замените его просто: 'player.play();'. –

+0

Резьба позволяет процессу работать в фоновом режиме. Из-за этого все остальные фьючерсы были неэффективными, пока песня все еще играла –