【问题标题】:How do I access and manipulate one file at a time in the getSelectedFiles() method?如何在 getSelectedFiles() 方法中一次访问和操作一个文件?
【发布时间】:2017-02-16 18:57:14
【问题描述】:

所以我正在尝试创建一个音乐播放器小部件,但一次播放多首选定的歌曲时遇到问题。我希望增强的 for 循环会遍历所有选定的文件并一次播放一个,但它会同时播放所有歌曲。有没有更好的方法来完成这项工作?

FileInputStream FIS;
BufferedInputStream BIS;

public Player player;
public long pauseLocation;
public long songTotalLength;
public boolean playState = false;
public String fileLocation;

public boolean playState(){
    return playState;
}

public void setPlayState(boolean value){
    this.playState = value;
}
public void select() {

    FileNameExtensionFilter filter = new FileNameExtensionFilter("MP3 Files", "mp3", "mpeg3");
    JFileChooser chooser = new JFileChooser("D:\\MAIN_DIV\\Music");
    chooser.addChoosableFileFilter(filter);
    chooser.setMultiSelectionEnabled(true);
    int returnVal = chooser.showOpenDialog(null);

    if (returnVal == JFileChooser.APPROVE_OPTION) {
        stop();

        if (playState == false) {
            File[] selectedFile = chooser.getSelectedFiles();
            for (File x : selectedFile) {
                String song = x + "";
                String name = chooser.getSelectedFile().getName();
                display.setText(name);
                play(song);
            }
        }
    }
}

public void play(String path){

    playState();
        try {
            FIS = new FileInputStream(path);
            BIS = new BufferedInputStream(FIS);
            player = new Player(BIS);
            songTotalLength = FIS.available();
            fileLocation = path + "";
            //System.out.println(path);
        } catch (FileNotFoundException | JavaLayerException ex) {

        } catch (IOException ex) {

        }



    new Thread (){
        @Override
        public void run(){

            if(playState == false){

                try {
                        player.play(); //play from start or resume


                    if (player.isComplete() && MusicPlayer.count==1){
                        play(fileLocation); 


                    }
                    if (player.isComplete()){
                        MusicPlayer.display.setText("");
                    }

                } catch (JavaLayerException ex) {

                }
            }    
        }
    }.start();
    setPlayState(false);

}

【问题讨论】:

  • 这样的for循环没有任何意义。问题是play。从您的问题中不清楚 play 的作用,但它可能会创建一个后台进程来播放歌曲并在歌曲播放时返回,让循环继续播放新歌曲。如果您显示play 的源代码,我们可能会为您提供帮助。另外:什么是播放列表?你不能在 for 循环之后运行播放列表吗?
  • 好的。这就是 play 的源代码。我从代码中删除了播放列表类(仍在处理中)。也许现在我可以得到更多帮助
  • 我希望只有在播放方法完成一首歌曲后才能继续循环

标签: java foreach


【解决方案1】:

这是问题的原因:

new Thread () { ... } .start();

创建一个在后台运行的线程来播放歌曲。 play 方法在歌曲播放时返回,让 for-loop 继续拾取新歌曲。

如果您只保留run-方法的主体,它应该可以按预期工作。这样,歌曲播放是按顺序进行的,play 会阻塞,直到 player.play(); 播放完毕。

【讨论】:

  • 保留我的 run 方法的主体?我不认为我真的明白这一点。
  • 方法的头部是声明部分(即 public void run()),方法的主体是大括号之间的所有内容。首先,删除整个线程代码 (new Thread () { ... }.start();) 并将其替换为:player.play();
  • 线程允许进程在后台运行。删除它会导致所有其他期货在歌曲仍在播放时无效
  • 我会尝试找到解决此问题的方法,因为现在歌曲一次播放一首。但我会感谢更多信息。
猜你喜欢
  • 2014-07-01
  • 2019-11-19
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
相关资源
最近更新 更多