点击进度条寻找MediaPlayer(javafx swing)

时间:2017-07-11 15:38:51

标签: java progress-bar media-player

我的音乐播放器的进度条最大值为mediaPlayer.getTotalDuration().toSeconds().

最近,当我点击某个位置上的progressBar时,我一直试图让mouseListener在返回的X值中寻找mediaPlayer。

问题:我点击progressBar,它似乎正在接收毫秒,所以我将它乘以1000,以便寻找相应的第二个计数。

这适用于某些音乐/ mp3,但对于较短的音乐/ mp3,或者较长的音乐/进程,progressBar只跳转到最近的可能位置,或者跳转到其他位置,由于* 1000计算X值而完全不准确。 (下面我已经尝试过某人建议另一个答案来计算X值到秒,我也尝试设置progressBar值并将该值设置为mediaPlayer所在的位置。)

“int point”是我收到X值的地方。

代码:

progressBar.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent mouseClick) {
            try{
            progressBar.setMaximum((int)mediaPlayer.getTotalDuration().toSeconds());
            int point = (int)Math.round(((double)mouseClick.getX() / (double)progressBar.getWidth()) * progressBar.getMaximum()); // previously tried "* 1000".
            Duration pointDuration = new Duration(point);
            mediaPlayer.seek(pointDuration);
            } catch (Exception e7){
                //
            }
        }
    });

(不幸的是,计算更糟糕。)

我应该使用哪种计算方法来正确搜索点击位置?

2 个答案:

答案 0 :(得分:0)

您必须明智地选择您的单位,并使其出现在您的代码中。我通常做的是将进度条限制在[0.0,1.0]范围内,即使用double算术的百分比。

当您收到鼠标单击事件时,您将转换该[0,1]范围内的事件位置。

需要做两件事:

  1. 进度条的宽度(以像素为单位)
  2. 鼠标点击相对于进度条组件的x坐标
  3. 你有一个准确的观点(注意toMilliseconds):

    double dx = evt.getX();
    double dwidth = progressBar.getWidth();
    double progression = (dx / dwidth);
    int milliseconds = (progression * mediaPlayer.getTotalDuration().toMilliseconds())
    Duration duration = new Duration(milliseconds);
    mediaPlayer.seek(duration);
    

答案 1 :(得分:0)

第一个错误是单击进度条时设置了progressBar最大值。当媒体正在播放并且您没有按progressBar时,progres bar的最大值是错误的。更改mediaPlayer持续时间时,应设置此值。您应该使用与mediaPlayer分配媒体相同的方法将侦听器添加到totalDurationProperty更改中。

Media media = new Media(filePath);
mediaPlayer = new MediaPlayer(media);
mainMediaView.setMediaPlayer(mediaPlayer);

mediaPlayer.totalDurationProperty().addListener(new ChangeListener<Duration>() {
                @Override
                public void changed(ObservableValue<? extends Duration> observable, Duration oldValue,
                        Duration newValue) {
                    progressBar.setMax(newValue.toSeconds());
                }
            });

第二个问题是Slider组件及其进度条的大小不同。

progressBar鼠标侦听器:

progressBar.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent mouseClick) {
        try{
          double value;
          value = (mouseClick.getX()-9) * (progressBar.getMax() / (progressBar.getWidth()-19));
          progressBar.setValue(value); 
        } catch (Exception e7){

        }
    }
});

您可能会问-9和-19如何出现在那里。通过反复试验获得这些值。由于Slider组件大于其进度条,因此getWidth()返回更大的值。这包括进度条两侧的间隙。 -9用于将单击位置调整为滑块组件和进度条开始之间的间隙。 -19 thats滑块组件的宽度因进度条两侧的间隙而变小。