2015-04-04 301 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

相关问题