Events JavaFX2.2:挂钩滑块拖放事件

Events JavaFX2.2:挂钩滑块拖放事件,events,drag-and-drop,slider,javafx-2,Events,Drag And Drop,Slider,Javafx 2,我试图捕捉JavaFX上的事件,特别是指示拖动停止并被释放的事件。首先,我将valueProperty与类似的模拟代码一起使用 slider.valueProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number oldValue, Number newValue

我试图捕捉JavaFX上的事件,特别是指示拖动停止并被释放的事件。首先,我将
valueProperty
与类似的模拟代码一起使用

slider.valueProperty().addListener(new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue<? extends Number> ov, Number oldValue, Number newValue) {
        log.fine(newValue.toString());
    }
});
slider.valueProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(observevalue向滑块添加一个更改侦听器,以了解滑块的值何时更改,并对值更改采取任何您想要的操作

下面的示例将在滑块开始更改时记录其值,并在完成更改时再次记录

import javafx.application.Application;
import javafx.beans.value.*;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class SliderChangeLog extends Application {
    private final ListView<String> startLog = new ListView<>();
    private final ListView<String> endLog   = new ListView<>();

    @Override public void start(Stage stage) throws Exception {
        Pane logsPane = createLogsPane();
        Slider slider = createMonitoredSlider();

        VBox layout = new VBox(10);
        layout.setAlignment(Pos.CENTER);
        layout.setPadding(new Insets(10));
        layout.getChildren().setAll(
                slider,
                logsPane
        );
        VBox.setVgrow(logsPane, Priority.ALWAYS);

        stage.setTitle("Slider Value Change Logger");
        stage.setScene(new Scene(layout));
        stage.show();
    }

    private Slider createMonitoredSlider() {
        final Slider slider = new Slider(0, 1, 0.5);
        slider.setMajorTickUnit(0.5);
        slider.setMinorTickCount(0);
        slider.setShowTickMarks(true);
        slider.setShowTickLabels(true);
        slider.setMinHeight(Slider.USE_PREF_SIZE);

        slider.valueChangingProperty().addListener(new ChangeListener<Boolean>() {
            @Override
            public void changed(
                    ObservableValue<? extends Boolean> observableValue,
                    Boolean wasChanging,
                    Boolean changing) {
                String valueString = String.format("%1$.3f", slider.getValue());

                if (changing) {
                    startLog.getItems().add(
                            valueString
                    );
                } else {
                    endLog.getItems().add(
                            valueString
                    );
                }
            }
        });
        return slider;
    }

    private HBox createLogsPane() {
        HBox logs = new HBox(10);
        logs.getChildren().addAll(
                createLabeledLog("Start", startLog),
                createLabeledLog("End",   endLog)
        );
        return logs;
    }

    public Pane createLabeledLog(String logName, ListView<String> log) {
        Label label = new Label(logName);
        label.setLabelFor(log);

        VBox logPane = new VBox(5);
        logPane.getChildren().setAll(
                label,
                log
        );

        logPane.setAlignment(Pos.TOP_LEFT);

        return logPane;
    }

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

导入javafx.application.application;
导入javafx.beans.value.*;
导入javafx.geometry.*;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.layout.*;
导入javafx.stage.stage;
公共类SliderChangeLog扩展了应用程序{
private final ListView STARTOG=新建ListView();
私有最终ListView endLog=新ListView();
@覆盖公共无效开始(阶段)引发异常{
窗格logsPane=createLogsPane();
Slider Slider=createMonitoredSlider();
VBox布局=新的VBox(10);
布局。设置对齐(位置中心);
布局。设置填充(新插图(10));
layout.getChildren().setAll(
滑块,
罗格斯潘
);
VBox.setVgrow(logsPane,Priority.ALWAYS);
stage.setTitle(“滑块值更改记录器”);
舞台场景(新场景(布局));
stage.show();
}
专用滑块createMonitoredSlider(){
最终滑块=新滑块(0,1,0.5);
滑块。setMajorTickUnit(0.5);
slider.setMinorTickCount(0);
滑块。设置显示标记(真);
slider.setShowTickLabels(真);
slider.setMinHeight(slider.USE\u PREF\u SIZE);
slider.valueChangingProperty().addListener(新的ChangeListener()){
@凌驾
更改公众假期(

ObservalEvaluejewelsea的回答非常有助于将我设置在正确的轨道上,但是如果“snapToTicks”处于启用状态,则会产生不期望的行为结果。jewelsea的侦听器捕获的“end”值是在快照发生之前,而从不捕获快照后的值

我的解决方案将侦听器设置为
value
,但将
valueChanging
用作哨兵。类似于:

slider.valueProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(
                ObservableValue<? extends Number> observableValue,
                Number previous,
                Number now) {
            if (!slider.isValueChanging()
                  || now.doubleValue() == slider.getMax()
                  || now.doubleValue() == slider.getMin()) {
                // This only fires when we're done
                // or when the slider is dragged to its max/min.
            }
        }
    });
slider.valueProperty().addListener(新的ChangeListener()){
@凌驾
更改公众假期(

ObservalEvalue有时,您可能想知道用户何时移动滑块,而滑块值由于绑定到属性而发生变化。例如,在媒体播放器视图上使用滑块来显示媒体时间轴。滑块不仅显示时间,还允许用户快进或快退。滑块绑定到媒体播放机的当前时间,该时间触发滑块上的更改值。如果用户移动滑块,您可能希望检测拖动,以便停止媒体播放机,让媒体播放机搜索到新时间并继续播放。不幸的是,滑块上似乎触发的唯一拖动事件是setOnDragDetected事件。因此,我使用以下两种方法检查滑块拖动

    slider.setOnDragDetected(new EventHandler<Event>() {
        @Override
        public void handle(Event event) {
            currentPlayer.pause();
            isDragged=true;     
        }
    });

slider.setOnMouseReleased(new EventHandler<Event>() {
        @Override
        public void handle(Event event) {
            if(isDragged){
                currentPlayer.seek(Duration.seconds((double) slider.getValue()));
                currentPlayer.play();
                isDragged=false;
            }       
        }
    });
检测到slider.setOnDragDetected(新的EventHandler(){ @凌驾 公共无效句柄(事件){ currentPlayer.pause(); IsDraged=正确; } }); slider.setOnMouseReleased(新的EventHandler(){ @凌驾 公共无效句柄(事件){ 如果(不规则){ currentPlayer.seek(Duration.seconds((双)slider.getValue()); currentPlayer.play(); IsDraged=错误; } } });
谢谢你,你帮了我很大的忙,拿我的第一个+1:)你知道如何通过更改手动更改滑块刻度距离吗?就像我想要2 4 8 16 32的刻度一样etc@thatsIch问一个关于滑块刻度距离的新问题。斯里奇的新问题是。太好了,这对我也有帮助,谢谢!但是我可以问一下,“SetonMousedragreeled”是什么吗如果没有,那么事件应该是有用的?它们什么时候触发?SetOnMousedragreeleed允许您在用户单击鼠标、按住鼠标、移动鼠标并随后释放鼠标时拦截事件。它是在应用程序中实现自定义拖动处理程序的相对低级API。不必使用SetOnMousedragreele例如,在绘画应用程序中通过拖动手势实现自定义选择矩形。在大多数情况下,将使用该方法而不是SetOnMousedragreeled方法。
    slider.setOnDragDetected(new EventHandler<Event>() {
        @Override
        public void handle(Event event) {
            currentPlayer.pause();
            isDragged=true;     
        }
    });

slider.setOnMouseReleased(new EventHandler<Event>() {
        @Override
        public void handle(Event event) {
            if(isDragged){
                currentPlayer.seek(Duration.seconds((double) slider.getValue()));
                currentPlayer.play();
                isDragged=false;
            }       
        }
    });