Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单击progressbar搜索MediaPlayer(JavaFXSwing)_Java_Progress Bar_Media Player - Fatal编程技术网

单击progressbar搜索MediaPlayer(JavaFXSwing)

单击progressbar搜索MediaPlayer(JavaFXSwing),java,progress-bar,media-player,Java,Progress Bar,Media Player,我有一个音乐播放器,它的progressbar的最大值为mediaPlayer.getTotalDuration().toSeconds()。 最近,我一直在尝试制作一个鼠标侦听器,当进度条点击某个位置时,将mediaPlayer搜索到返回的X值 问题是:我点击progressBar,它似乎接收到毫秒数,所以我将它乘以1000,这样它就会寻找对应的秒数 这对于某些音乐/MP3非常有效,但对于较短或较长的音乐/MP3,progressBar仅跳到最近的可能位置,或跳到其他位置,由于X值的*1000

我有一个音乐播放器,它的progressbar的最大值为
mediaPlayer.getTotalDuration().toSeconds()。

最近,我一直在尝试制作一个鼠标侦听器,当进度条点击某个位置时,将mediaPlayer搜索到返回的X值

问题是:我点击progressBar,它似乎接收到毫秒数,所以我将它乘以1000,这样它就会寻找对应的秒数

这对于某些音乐/MP3非常有效,但对于较短或较长的音乐/MP3,progressBar仅跳到最近的可能位置,或跳到其他位置,由于X值的*1000计算,因此完全不准确。(下面我尝试了其他人的建议,用另一个答案将X值计算为秒,我还尝试了设置progressBar值并将该值设置为mediaPlayer所在的位置。)

“int point”是接收X值的位置

代码:

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


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

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

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

需要两件事:

  • 进度条的宽度(以像素为单位)
  • 鼠标单击相对于progressbar组件的x坐标
  • 你有一个准确的点(注意
    tomilliskes
    ):


    您犯的第一个错误是在单击进度条时设置进度条最大值。媒体播放时,您没有按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());
                    }
                });
    
    你可能会问-9和-19是怎么出现在那里的。通过反复试验得到这些值。当滑块组件大于其进度条时,getWidth()返回较大的值。这包括进度条两侧的间隙-9用于将单击位置调整为滑块组件和进度条开始之间的间隙-19这是滑块组件宽度小于进度条两侧的间隙

    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);
    
    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());
                    }
                });
    
    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){
    
            }
        }
    });