繁体   English   中英

从文本文件读取的Music Player一次播放所有片段Javafx

[英]Music Player reading from text file plays all pieces at once Javafx

您好,我目前正在尝试向应用程序添加音乐,现在我正在让程序从文件中获取文件名并进行播放。 由于该应用程序中的一个缺陷,我尝试通过使线程进入睡眠状态进行调解,因此音乐播放器同时播放两个片段,虽然听起来不错,但对我没有帮助。 下面是我的代码:

    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;
    }
}

可以考虑使用事件驱动的方法来代替循环和休眠的方法。 您可以在媒体播放器上注册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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM