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文件。我尝试了很多东西,但似乎没有任何效果。我有自己的数据结构,但它与内置的 Iterator
和 ArrayList
代码几乎相同。
您没有根据播放列表中的新位置调整 Iterator
的位置。鉴于用户点击的项目的索引,您可以使用 List.listIterator
.
简单地用新的替换 Iterator
这是一个使用 ListView
和 String
显示在标签中的简化示例:
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();
}
当我启动我的媒体播放器并单击下一首歌曲按钮时,它会从第一首歌曲开始并按预期在列表中向下移动。但是如果我启动程序,双击一个 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文件。我尝试了很多东西,但似乎没有任何效果。我有自己的数据结构,但它与内置的 Iterator
和 ArrayList
代码几乎相同。
您没有根据播放列表中的新位置调整 Iterator
的位置。鉴于用户点击的项目的索引,您可以使用 List.listIterator
.
Iterator
这是一个使用 ListView
和 String
显示在标签中的简化示例:
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();
}