2015-04-04 291 views
0

因此,我正在製作一個帶有javafx的MP3播放器,其中有一個ListView,用於拖放歌曲,然後選擇一首歌曲並按播放播放它,您就會明白了。 問題是,用我現在的代碼,我不能播放兩個以上歌曲的序列:/(播放選定的歌曲,播放歌曲旁邊的歌曲然後停止)。 下面的代碼:無法播放播放列表中的所有歌曲

public class MainController implements Initializable { 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     list.setItems(tracklist); 
    } 

    private MediaPlayer player; 
    private Duration pausetime = null; 
    private int i; 

    ObservableList<String> tracklist = FXCollections.observableArrayList(); 
    ArrayList<File> playlist = new ArrayList<File>(); 
    ArrayList<MediaPlayer> players = new ArrayList<MediaPlayer>(); 

    @FXML 
    private Slider slider; 

    @FXML 
    private Button open; 

    @FXML 
    private Label csong; 

    @FXML 
    private ListView<String> list; 

    public void getsongfromlist(){ 
     i = list.getSelectionModel().getSelectedIndex(); 
    } 

    public void slide(int a){ 
     slider.setMin(0.0); 
     slider.setValue(0.0); 

     player.currentTimeProperty().addListener(new ChangeListener<Duration>(){ 

      @Override 
      public void changed(ObservableValue<? extends Duration> observableValue, Duration duration, 
        Duration current) { 
       // TODO Auto-generated method stub 
       slider.setMax(players.get(a).getTotalDuration().toSeconds()); 
       slider.setValue(current.toSeconds()); 
      } 
     }); 
    } 

    public void move(){ 
     player.seek(Duration.seconds(slider.getValue())); 
    } 

    public void play(){    //This is where im getting it wrong 
     if (player != null){ 
      player.stop(); 
     } 
     this.player = players.get(i); 
     player.play(); 
     slide(i); 
     csong.setText(playlist.get(i).getName()); 
     for (int j = 0; j < players.size(); j++){ 
     player.setOnEndOfMedia(new Runnable(){ 
      @Override public void run(){ 
      i++; 
      list.getSelectionModel().select(i); 
      player = players.get(i); 
      player.play(); 
      slide(i); 
      csong.setText(playlist.get(i).getName()); 
      } 
     }); 
    } 
    } 

    public void handle(DragEvent event) { 
     Dragboard db = event.getDragboard(); 
     if (db.hasFiles()) { 
      event.acceptTransferModes(TransferMode.COPY); 
     } else { 
      event.consume(); 
     } 
    } 

    public void dropped(DragEvent event){ 
     Dragboard db = event.getDragboard(); 
     event.acceptTransferModes(TransferMode.COPY); 
     boolean success = false; 
     if (db.hasFiles()){ 
      success = true; 
      for (File file:db.getFiles()){ 
       tracklist.add(file.getName()); 
       playlist.add(file); 
       try { 
        final Media media = new Media(file.toURI().toURL().toString()); 
        final MediaPlayer set = new MediaPlayer(media); 
        players.add(set); 
       } catch (MalformedURLException e) { 

        e.printStackTrace(); 
       } 
      } 
     } 
     event.setDropCompleted(success); 
     event.consume(); 
    } 
} 

回答

1

沒有測試,但是儘量與

player.setOnEndOfMedia(new Runnable(){ 
    @Override 
    public void run() { 
     i++ ; 
     play(); 
    } 
}); 

替換

for (int j = 0; j < players.size(); j++){ 
    player.setOnEndOfMedia(new Runnable(){ 
     @Override public void run(){ 
     i++; 
     list.getSelectionModel().select(i); 
     player = players.get(i); 
     player.play(); 
     slide(i); 
     csong.setText(playlist.get(i).getName()); 
     } 
    }); 
} 

和移離聽者endOfMedia

list.getSelectionModel().select(i); 

play()方法的主體。

+0

工作,謝謝! – Peralta 2015-04-05 12:31:26

0

我會嘗試改變if player != null。 嘗試一個不同的值,例如您想播放的歌曲數量。

+0

謝謝,但該行只是爲了確保該程序不能同時播放兩首歌曲,並且它按預期工作。我的問題是讓for循環迭代整個播放列表而不是僅僅兩首歌曲。無論如何謝謝:) – Peralta 2015-04-05 01:13:26

相關問題