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