如何获得歌曲的时间的工作纳入音乐播放器

0

的问题

我已经创建了一个音乐播放器使用的系统. 然而,我不能明白我怎么可能知道的持续时间的一首歌我目前正在播放。

编辑: 我已经加入下面的线向我的代码和现在的歌曲时间是可见的。 然而,当我玩下一首歌,歌曲的时间是不可见的。 这里是我加入代码:

mediaPlayer.currentTimeProperty().addListener(new TimeListener());  

TimeListener = new ChangeListener<Duration>() 
        {
              @Override public void changed(ObservableValue<? extends Duration> o, Duration oldVal, Duration newVal) 
              {
             //now newVal is of Duration class
              }
            };

    }
    
    public class TimeListener implements ChangeListener {
        public void changed(ObservableValue o, Object oldVal, Object newVal) {

        //Update time display with MediaPlayer's current time:
        playTime.setText(newVal.toString());
        }
    }

这里是我的代码创造音乐播放器:

    public class MusicController implements Initializable 
{
    @FXML
    private ImageView trackLogo;
    @FXML
    private Button next, previous, pause, play, reset;
    @FXML
    private Slider VolumeSlider;    
    @FXML
    private AnchorPane Panel;   
    @FXML
    private Label playTime, appTitle, songTitle;    
    @FXML
    private ProgressBar songProgressBar;
    @FXML
    private Media media;
    private MediaPlayer mediaPlayer;
    private File directory;
    private File [] files;
    private ArrayList<File> songs;  
    private int songNumber; 
    private Timer timer;
    private TimerTask task;
    private boolean running;
    private ChangeListener<Duration> TimeListener;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) 
    {
        songs = new ArrayList<File>();      
        directory = new File("music");      
        files = directory.listFiles();      
        if(files!=null) 
        {
            for(File file : files)
            {
                songs.add(file);
                System.out.println(file);
            }
        }       
        media = new Media(songs.get(songNumber).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
        mediaPlayer.currentTimeProperty().addListener(new TimeListener());      
        songTitle.setText(songs.get(songNumber).getName());
        VolumeSlider.valueProperty().addListener(new ChangeListener<Number>()
                {
                    public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) 
                    {       
                        mediaPlayer.setVolume(VolumeSlider.getValue() * 0.01);  
                    }
                });
        
        TimeListener = new ChangeListener<Duration>() 
        {
              @Override public void changed(ObservableValue<? extends Duration> o, Duration oldVal, Duration newVal) 
              {
             //now newVal is of Duration class
              }
            };

    }
    
    public class TimeListener implements ChangeListener {
        public void changed(ObservableValue o, Object oldVal, Object newVal) {

        //Update time display with MediaPlayer's current time:
        playTime.setText(newVal.toString());
        }
    }
    
    public void playMedia() 
    {   
            beginTimer();
            mediaPlayer.setVolume(VolumeSlider.getValue() * 0.01);
            mediaPlayer.play();
    }
    
    public void pauseMedia() 
    {   
            cancelTimer();
            mediaPlayer.pause();
    }

    public void resetMedia() 
    {   
            songProgressBar.setProgress(0);
            mediaPlayer.seek(Duration.seconds(0));
    }
    
    public void previousMedia() 
    {   
        if (songNumber > 0)
        {
            songNumber--;
            mediaPlayer.stop();
            
            if(running)
            {
                cancelTimer();
            }
            
            media = new Media(songs.get(songNumber).toURI().toString());
            mediaPlayer = new MediaPlayer(media);
            songTitle.setText(songs.get(songNumber).getName());
            playMedia();

        }
        else
        {
            songNumber = songs.size() - 1;
            mediaPlayer.stop();
            
            if(running)
            {
                cancelTimer();
            }
            
            
            media = new Media(songs.get(songNumber).toURI().toString());
            mediaPlayer = new MediaPlayer(media);
            songTitle.setText(songs.get(songNumber).getName());
            playMedia();
        }
    }
    
    public void nextMedia() 
    {   
        if (songNumber < songs.size() - 1)
        {
            songNumber++;
            mediaPlayer.stop();
            
            if(running)
            {
                cancelTimer();
            }
    
            media = new Media(songs.get(songNumber).toURI().toString());
            mediaPlayer = new MediaPlayer(media);
            songTitle.setText(songs.get(songNumber).getName());
            playMedia();

        }
        else
        {
            songNumber = 0;
            mediaPlayer.stop();
            
            if(running)
            {
                cancelTimer();
            }
            media = new Media(songs.get(songNumber).toURI().toString());
            mediaPlayer = new MediaPlayer(media);
            songTitle.setText(songs.get(songNumber).getName());
            playMedia();
        }
    }
    
    
    public void beginTimer() 
    {   
        timer = new Timer();
        task = new TimerTask()
                {   
                    public void run() 
                    {
                        running = true;
                        double current = mediaPlayer.getCurrentTime().toSeconds();
                        double end = media.getDuration().toSeconds();
                        System.out.println(current/end);
                        songProgressBar.setProgress(current/end);
                        
                        if (current/end ==1)
                        {
                            cancelTimer();
                        }
                        
                    }
                };
                timer.scheduleAtFixedRate(task, 0, 1000);
    }
    
    public void cancelTimer() 
    {   
            running = false;
            timer.cancel();
    }
    
}

我试图阅读Oracle文件(https://docs.oracle.com/javase/8/javafx/media-tutorial/playercontrol.htm)和这个youtube视频(https://www.youtube.com/watch?v=-D2OIekCKes)创建一个音乐播放器。

我将感谢任何的帮助。 在此先感谢!

java javafx scenebuilder
2021-11-23 06:16:25
1

最好的答案

1

你不应该使用 Timer或螺纹在一般情况下,对于像这样的东西。 的性质 MediaPlayer 是可观察到的,所以你应该添加的听众,或约束UI性。 这里有一个例子的结合 ProgressBar's进展酒店的游戏:

progressBar.progressProperty().bind(
    Bindings.createDoubleBinding(() -> {
      Duration current = mediaPlayer.getCurrentTime();
      Duration total = mediaPlayer.getCycleDuration();
      return current.toMilli() / total.toMillis();
    },
    mediaPlayer.currentTimeProperty(),
    mediaPlayer.cycleDurationProperty())
);

上述使用的 绑#createDoubleBinding(可调用的、可观察...)lambda表情.

你需要做的上述每一次新的 MediaPlayer 创建,但否则,将处理维持取得的进展吧up-to-date. 你可以做一些类似的标签显示,例如,目前的时间和总时间在一个人可读的格式。

还有,而不是添加一个听到你的 volumeSlider 你可以这样做:

mediaPlayer.volumeProperty().bind(volumeSlider.valueProperty());

看到 采用系统性和约束力 的更多信息。


此外,不仅应该你不用 Timer 在这里,但你的方式使用它,是不正确的。 在纳,有一个特殊的线命名该 系统的应用程序线. 只有那个线程应当互动,直接或间接的。 使用任何其他线交互UI坏了代码,并可能导致未定义的行为纳入不是线的安全。

你可以安排行动的外汇使用螺纹 Platform#runLater(Runnable).

2021-11-23 08:20:29

谢谢你这么多你的帮助。 我会尽力实现你的建议在我的节目。
Devanshu Mahapatra

jewelsea

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................