Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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
User interface JavaFX-拖动鼠标按钮后设置滑块值_User Interface_Javafx_Slider - Fatal编程技术网

User interface JavaFX-拖动鼠标按钮后设置滑块值

User interface JavaFX-拖动鼠标按钮后设置滑块值,user-interface,javafx,slider,User Interface,Javafx,Slider,我正在编写音乐播放器,我不知道如何编写滑块拖动处理程序,以便在用户释放鼠标按钮后设置值。当我编写简单的MouseDragged方法时,拖动会带来不受欢迎的“倒带”声音,因为mediaplayer会在滑块每次移动时更改值。播放滑块时,mediaplayer侦听器会自动更改值以与曲目持续时间同步。这就是我目前得到的 ChangeListener<Duration> timeListener = new ChangeListener<Duration>() { @Ov

我正在编写音乐播放器,我不知道如何编写滑块拖动处理程序,以便在用户释放鼠标按钮后设置值。当我编写简单的MouseDragged方法时,拖动会带来不受欢迎的“倒带”声音,因为mediaplayer会在滑块每次移动时更改值。播放滑块时,mediaplayer侦听器会自动更改值以与曲目持续时间同步。这就是我目前得到的

ChangeListener<Duration> timeListener =  new ChangeListener<Duration>() {
    @Override
    public void changed(
            ObservableValue<? extends Duration> observableValue,
            Duration duration,
            Duration current) {
        durSlider
                .setValue(current
                        .toSeconds());
    }
};

durSlider.setOnMouseDragged(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {

                    mediaPlayer.seek(Duration.seconds(durSlider.getValue()));

                    }

                });
ChangeListener timeListener=新的ChangeListener(){
@凌驾
更改公众假期(
ObservalEvalue指示滑块是否正在更改。它是一个可观察属性,因此您可以直接将侦听器附加到它,并在值停止更改时响应:

durSlider.valueChangingProperty().addListener(new ChangeListener<Boolean>() {
    @Override
    public void changed(ObservableValue<? extends Boolean> obs, Boolean wasChanging, Boolean isNowChanging) {
        if (! isNowChanging) {
            mediaPlayer.seek(Duration.seconds(durSlider.getValue()));
        }
    }
});

谢谢你的回答,但你显然没有注意到我的timeListener属性。你的解决方案只有在不加上它的情况下才能工作,但是slider不会与曲目持续时间同步。当我把你的侦听器放在一起时,整个播放过程都会出错,因为slider的值每过一秒都在变化,而不仅仅是当用户点击它时。啊,我我认为它无论如何都会工作,因为它应该只寻找到它已经处于的相同位置。我猜在某个地方有一些舍入,导致它重复进行非常小的调整。请参阅更新的答案。谢谢!现在它工作正常。对我来说,它看起来像死胡同,但你关于静态双变量的想法非常棒。我有几乎相同的想法代码已经存在,但不知道如何使关键调整生效?仍然无法与您的版本一起工作。。。
private static double MIN_CHANGE = 0.5 ; //seconds

// ...

durSlider.valueProperty().addListener(new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue<? extends Number> obs, Number oldValue, Number newValue) {
        if (! durSlider.isValueChanging()) {
            double currentTime = mediaPlayer.getCurrentTime().toSeconds();
            double sliderTime = newValue.doubleValue();
            if (Math.abs(currentTime - sliderTime) > 0.5) {
                mediaPlayer.seek(newValue.doubleValue());
            }
        }
    }
});
ChangeListener<Duration> timeListener =  new ChangeListener<Duration>() {
    @Override
    public void changed(
            ObservableValue<? extends Duration> observableValue,
            Duration duration,
            Duration current) {
        if (! durSlider.isValueChanging()) {
            durSlider.setValue(current.toSeconds());
        }
    }
};
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.Stage;
import javafx.util.Duration;

public class VideoPlayerTest extends Application {

    private static final String MEDIA_URL =
            "http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv";

    private static final double MIN_CHANGE = 0.5 ;

    @Override
    public void start(Stage primaryStage) {
        MediaPlayer player = new MediaPlayer(new Media(MEDIA_URL));
        MediaView mediaView = new MediaView(player);

        Slider slider = new Slider();
        player.totalDurationProperty().addListener((obs, oldDuration, newDuration) -> slider.setMax(newDuration.toSeconds()));

        BorderPane root = new BorderPane(mediaView, null, null, slider, null);

        slider.valueChangingProperty().addListener((obs, wasChanging, isChanging) -> {
            if (! isChanging) {
                player.seek(Duration.seconds(slider.getValue()));
            }
        });

        slider.valueProperty().addListener((obs, oldValue, newValue) -> {
            if (! slider.isValueChanging()) {
                double currentTime = player.getCurrentTime().toSeconds();
                if (Math.abs(currentTime - newValue.doubleValue()) > MIN_CHANGE) {
                    player.seek(Duration.seconds(newValue.doubleValue()));
                }
            }
        });

        player.currentTimeProperty().addListener((obs, oldTime, newTime) -> {
            if (! slider.isValueChanging()) {
                slider.setValue(newTime.toSeconds());
            }
        });

        Scene scene = new Scene(root, 540, 280);
        primaryStage.setScene(scene);
        primaryStage.show();

        player.play();
    }

    public static void main(String[] args) {
        launch(args);
    }
}