java - 从文本文件读取的音乐播放器会同时播放所有片段 Javafx

标签 java javafx while-loop media-player thread-sleep

您好,我目前正在尝试将音乐添加到我的应用程序中,现在我正在让程序从文件中获取文件名并播放它们。由于应用程序中存在缺陷,我尝试通过使线程 hibernate 来进行调解,音乐播放器同时播放两首曲子,虽然听起来不错,但对我没有帮助。下面是我的代码:

    public static class MusicPlayerService extends Service<Void>
{
    public static File[] musicArray = new File[2];
    public static int fileNumber = 0;

    @Override
    protected Task<Void> createTask(){
        Scanner musicListReader;
        try {
            musicListReader = new Scanner(new File("Music_PlayList.txt"));
            while(musicListReader.hasNext())
            {
                musicArray[fileNumber] = new File(musicListReader.next());
                String uriString = musicArray[fileNumber].toURI().toString();
                Media media = new Media(uriString);
                MediaPlayer player = new MediaPlayer(media);
                player.play();
                Thread.sleep((long) media.getDuration().toMillis());
                fileNumber++;
            }
        } catch (FileNotFoundException | InterruptedException e1) {
            e1.printStackTrace();
        }   
        return null;
    }
}

最佳答案

考虑使用事件驱动方法,而不是循环和 sleep 方法。您可以向媒体播放器注册一个 onStopped 处理程序,并从那里开始播放下一首歌曲(如果有下一首歌曲)。这样,您也不需要使用后台线程。

类似于:

Queue<File> musicList = new LinkedList<File>();

try (Scanner musicListReader = new Scanner(new File("Music_PlayList.txt"))) {

    while (musicListReader.hasNext()) {
        musicList.add(new File(musicListReader.next()));
    }

} catch (Exception e) {
    e.printStackTrace();
}

playNextMusicFile(musicList);

// ...

private void playNextMusicFile(Queue<File> musicList) {
    if (musicList.isEmpty()) {
        return ;
    }

    Media media = new Media(musicList.remove().toURI().toString());
    MediaPlayer player = new MediaPlayer(media);
    player.setOnEndOfMedia(() -> {
        player.dispose();
        playNextMusicFile(musicList);
    });
    player.play();
}

关于java - 从文本文件读取的音乐播放器会同时播放所有片段 Javafx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39907785/

相关文章:

java - 关于android中controltransfer设置USB通信的说明

java - 数据库层非 ORM (Java)

java - 数据分配 JavaFX 后无法从 TableView 检索所有行

java - 是否可以从 close 方法返回 javaFX 中的变量?有没有更有效的方法来做到这一点?

java - 文件没有值

java - 使用 HashMap 时,值和键在迭代时是否保证顺序相同?

java - 应用程序上下文中某些bean的依赖关系形成循环:

JAVAFX 舞台会根据场景的变化而改变其大小。或者这就是我的想法

javascript - 为什么全局修饰符不能正常工作?

c - 如何使用 C 中的 for 循环打印答案序列?