Events JavaFX2.2:挂钩滑块拖放事件
我试图捕捉JavaFX上的事件,特别是指示拖动停止并被释放的事件。首先,我将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
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;
}
}
});