Javafx 2 使用javafx播放视频时如何使用时间轴

Javafx 2 使用javafx播放视频时如何使用时间轴,javafx-2,Javafx 2,我们正在使用JavaFXMediaPlayer来播放.mp4格式 我有时间线的问题,我的问题是如果我们点击时间线上的任何一点, 应该从那一点开始。为此,我使用了下面的代码 timeSlider.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { mediaPlayer.seek(Duration.seconds(t

我们正在使用JavaFXMediaPlayer来播放.mp4格式 我有时间线的问题,我的问题是如果我们点击时间线上的任何一点, 应该从那一点开始。为此,我使用了下面的代码

timeSlider.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent t) {
        mediaPlayer.seek(Duration.seconds(timeSlider.getValue()));
       }
    });
timeSlider.setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent t){
mediaPlayer.seek(Duration.seconds(timeSlider.getValue());
}
});
但这并不正常。有谁能帮我解决上述问题吗


提前感谢

Oracle提供了一个关于这方面的精彩教程

您可以在应用程序中看到教程播放器的运行

本教程包含有关合并玩家时间线的信息

下面是JavaFX视频播放器控件的屏幕截图,其中包含来自Ensemble的时间线

创建滑块以控制位置的步骤如下:

  • 创建
    MediaView
    并将其关联到
    MediaPlayer
  • 创建一个
    滑块来控制时间
  • 收听对
    滑块的更改,并根据需要更新
    MediaPlayer
    位置
  • 收听对
    MediaPlayer
    当前时间的更改,并根据需要更新
    滑块
  • 示例中的一些特定于时间滑块的代码片段包括:

    // Media player
    MediaPlayer mp = new MediaPlayer(new Media(MEDIA_URL));
    
    // Time label
    Label timeLabel = new Label("Time: ");
    timeLabel.setMinWidth(Control.USE_PREF_SIZE);
    mediaBar.getChildren().add(timeLabel);
    
    // Time slider
    timeSlider = new Slider();
    HBox.setHgrow(timeSlider, Priority.ALWAYS);
    timeSlider.setMinWidth(50);
    timeSlider.setMaxWidth(Double.MAX_VALUE);
    timeSlider.valueProperty().addListener(new InvalidationListener() {
        public void invalidated(Observable ov) {
            if (timeSlider.isValueChanging()) {
                // multiply duration by percentage calculated by slider position
                if(duration!=null) {
                    mp.seek(duration.multiply(timeSlider.getValue() / 100.0));
                }
                updateValues();
           }
        }
    });
    ....
    protected void updateValues() {
        if (playTime != null && timeSlider != null && volumeSlider != null && duration != null) {
            Platform.runLater(new Runnable() {
                public void run() {
                    Duration currentTime = mp.getCurrentTime();
                    playTime.setText(formatTime(currentTime, duration));
                    timeSlider.setDisable(duration.isUnknown());
                    if (!timeSlider.isDisabled() && duration.greaterThan(Duration.ZERO) && !timeSlider.isValueChanging()) {
                        timeSlider.setValue(currentTime.divide(duration).toMillis() * 100.0);
                    }
                    if (!volumeSlider.isValueChanging()) {
                        volumeSlider.setValue((int) Math.round(mp.getVolume() * 100));
                    }
                }
            });
        }
    }
    ...
    mp.currentTimeProperty().addListener(new ChangeListener<Duration>() {
        @Override
            public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
                updateValues();
        }
    });
    // and also invoke updateValues when the MediaPlayer is played, paused, etc.
    
    //媒体播放器
    MediaPlayer mp=新媒体播放器(新媒体(媒体URL));
    //时间标签
    标签timeLabel=新标签(“时间:”);
    timeLabel.setMinWidth(控件。使用前缀大小);
    mediaBar.getChildren().add(timeLabel);
    //时间滑块
    时间滑块=新滑块();
    HBox.setHgrow(timeSlider,Priority.ALWAYS);
    时间滑块设置最小宽度(50);
    timeSlider.setMaxWidth(双倍最大值);
    timeSlider.valueProperty().addListener(新的InvalizationListener()){
    公共无效无效(可观察ov){
    if(timeSlider.isValueChanging()){
    //将持续时间乘以滑块位置计算的百分比
    if(持续时间!=null){
    mp.seek(duration.multiply(timeSlider.getValue()/100.0));
    }
    updateValue();
    }
    }
    });
    ....
    受保护的void updateValue(){
    如果(播放时间!=null&&timeSlider!=null&&volumesslider!=null&&duration!=null){
    Platform.runLater(新的Runnable(){
    公开募捐{
    持续时间currentTime=mp.getCurrentTime();
    playTime.setText(formatTime(当前时间,持续时间));
    timeSlider.setDisable(duration.isUnknown());
    如果(!timeSlider.isDisabled()&&duration.greaterThan(duration.ZERO)&&!timeSlider.isValueChanging()){
    timeSlider.setValue(currentTime.divide(duration.toMillis()*100.0);
    }
    如果(!volumeSlider.isValueChanging()){
    volumeSlider.setValue((int)Math.round(mp.getVolume()*100));
    }
    }
    });
    }
    }
    ...
    mp.currentTimeProperty().addListener(新的ChangeListener()){
    @凌驾
    
    public void changed(observevalueOracle提供了一个很好的教程

    您可以在应用程序中看到教程播放器的运行

    本教程包含有关合并玩家时间线的信息

    下面是JavaFX视频播放器控件的屏幕截图,其中包含来自Ensemble的时间线

    创建滑块以控制位置的步骤如下:

  • 创建
    MediaView
    并将其关联到
    MediaPlayer
  • 创建一个
    滑块来控制时间
  • 收听对
    滑块的更改,并根据需要更新
    MediaPlayer
    位置
  • 收听对
    MediaPlayer
    当前时间的更改,并根据需要更新
    滑块
  • 示例中的一些特定于时间滑块的代码片段包括:

    // Media player
    MediaPlayer mp = new MediaPlayer(new Media(MEDIA_URL));
    
    // Time label
    Label timeLabel = new Label("Time: ");
    timeLabel.setMinWidth(Control.USE_PREF_SIZE);
    mediaBar.getChildren().add(timeLabel);
    
    // Time slider
    timeSlider = new Slider();
    HBox.setHgrow(timeSlider, Priority.ALWAYS);
    timeSlider.setMinWidth(50);
    timeSlider.setMaxWidth(Double.MAX_VALUE);
    timeSlider.valueProperty().addListener(new InvalidationListener() {
        public void invalidated(Observable ov) {
            if (timeSlider.isValueChanging()) {
                // multiply duration by percentage calculated by slider position
                if(duration!=null) {
                    mp.seek(duration.multiply(timeSlider.getValue() / 100.0));
                }
                updateValues();
           }
        }
    });
    ....
    protected void updateValues() {
        if (playTime != null && timeSlider != null && volumeSlider != null && duration != null) {
            Platform.runLater(new Runnable() {
                public void run() {
                    Duration currentTime = mp.getCurrentTime();
                    playTime.setText(formatTime(currentTime, duration));
                    timeSlider.setDisable(duration.isUnknown());
                    if (!timeSlider.isDisabled() && duration.greaterThan(Duration.ZERO) && !timeSlider.isValueChanging()) {
                        timeSlider.setValue(currentTime.divide(duration).toMillis() * 100.0);
                    }
                    if (!volumeSlider.isValueChanging()) {
                        volumeSlider.setValue((int) Math.round(mp.getVolume() * 100));
                    }
                }
            });
        }
    }
    ...
    mp.currentTimeProperty().addListener(new ChangeListener<Duration>() {
        @Override
            public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
                updateValues();
        }
    });
    // and also invoke updateValues when the MediaPlayer is played, paused, etc.
    
    //媒体播放器
    MediaPlayer mp=新媒体播放器(新媒体(媒体URL));
    //时间标签
    标签timeLabel=新标签(“时间:”);
    timeLabel.setMinWidth(控件。使用前缀大小);
    mediaBar.getChildren().add(timeLabel);
    //时间滑块
    时间滑块=新滑块();
    HBox.setHgrow(timeSlider,Priority.ALWAYS);
    时间滑块设置最小宽度(50);
    timeSlider.setMaxWidth(双倍最大值);
    timeSlider.valueProperty().addListener(新的InvalizationListener()){
    公共无效无效(可观察ov){
    if(timeSlider.isValueChanging()){
    //将持续时间乘以滑块位置计算的百分比
    if(持续时间!=null){
    mp.seek(duration.multiply(timeSlider.getValue()/100.0));
    }
    updateValue();
    }
    }
    });
    ....
    受保护的void updateValue(){
    如果(播放时间!=null&&timeSlider!=null&&volumesslider!=null&&duration!=null){
    Platform.runLater(新的Runnable(){
    公开募捐{
    持续时间currentTime=mp.getCurrentTime();
    playTime.setText(formatTime(当前时间,持续时间));
    timeSlider.setDisable(duration.isUnknown());
    如果(!timeSlider.isDisabled()&&duration.greaterThan(duration.ZERO)&&!timeSlider.isValueChanging()){
    timeSlider.setValue(currentTime.divide(duration.toMillis()*100.0);
    }
    如果(!volumeSlider.isValueChanging()){
    volumeSlider.setValue((int)Math.round(mp.getVolume()*100));
    }
    }
    });
    }
    }
    ...
    mp.currentTimeProperty().addListener(新的ChangeListener()){
    @凌驾
    
    public void changed(ObservalEvalue在listener on slider value Invalization中您应该检查用户最近是否按下了鼠标按钮(例如,在最近100毫秒内)。Scala中的示例代码(翻译成Java相当简单):

    val timeSlider=新滑块{
    /**
    *@return true,如果用户在最近的`t`ms内按下鼠标按钮
    */
    def鼠标已按下
    
    class YieldingSlider extends Slider
    {
        private long lastTimeMousePressed = 0;
    
        public YieldingSlider()
        {
            addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>()
            {
                @Override
                public void handle(final MouseEvent event)
                {
                    lastTimeMousePressed = System.currentTimeMillis();
                }
            });
        }
    
        public boolean mouseWasPressedWithinLast(long t)
        {
            return (System.currentTimeMillis() - lastTimeMousePressed) <= t;
        }
    }