javafx MediaPlayer-获取下一首歌曲

javafx MediaPlayer- getting the next song

当我启动我的媒体播放器并单击下一首歌曲按钮时,它会从第一首歌曲开始并按预期在列表中向下移动。但是如果我启动程序,双击一个 mp3 文件来播放它,然后单击下一首歌曲按钮,播放列表中的第一首歌曲,而不是我双击的 mp3 之后的 mp3。

btn.setOnAction((ActionEvent e) ->
{

    if(doubleClicked)
    {
        player.stop();
        media = new Media(rowData.toURI().toString()); // needs to go to next song
        player = new MediaPlayer(media);
        player.play();
        return;
    }
    if(music.hasNext())
    {
        try
        {               
            player.stop();
            media = new Media(music.next());
            player = new MediaPlayer(media);

            player.play();

            lbl.setText(media.getSource());   
        }
        catch(MediaException a)
        {
            System.out.println("Unsupported Format");
        }
    }

});

rowData是双击后的mp3文件。我尝试了很多东西,但似乎没有任何效果。我有自己的数据结构,但它与内置的 IteratorArrayList 代码几乎相同。

您没有根据播放列表中的新位置调整 Iterator 的位置。鉴于用户点击的项目的索引,您可以使用 List.listIterator.

简单地用新的替换 Iterator

这是一个使用 ListViewString 显示在标签中的简化示例:

private Iterator<String> songIterator;

@Override
public void start(Stage primaryStage) {
    ObservableList<String> songs = FXCollections.observableArrayList("Song 1", "Song 2", "Song 3", "Song 4");

    // start with first song
    songIterator = songs.iterator();
    Label songLabel = new Label(songIterator.next());
    ListView<String> lv = new ListView(songs);

    MultipleSelectionModel<String> selectionModel = lv.getSelectionModel();

    lv.setCellFactory(t -> new ListCell<String>() {

        {
            setOnMouseClicked(evt -> {
                if (evt.getButton() == MouseButton.PRIMARY && evt.getClickCount() == 2) {
                    evt.consume();
                    // update label
                    songLabel.setText(getItem());
                    // iterator should return next item next
                    songIterator = songs.listIterator(selectionModel.getSelectedIndex()+1);
                }
            });
        }

        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            setText(empty ? null : item);
        }

    });

    Button btn = new Button();
    btn.setText("Next");
    btn.setOnAction((ActionEvent event) -> {
        if (songIterator.hasNext()) {
            songLabel.setText(songIterator.next());
        }
    });

    Scene scene = new Scene(new VBox(songLabel, lv, btn));

    primaryStage.setScene(scene);
    primaryStage.show();
}