JavaFX:区分点击和点击拖动
JavaFX: differentiate between click and click-dragged
我有多个标签。我有一个 EventHandler<MouseEvent>
在单击标签 (setOnMouseClicked) 时启动一个方法(打开一个对话框)。
不过,我还使用 EventHandler 实现了 setOnMousePressed/setOnMouseDragged 方法,使 Label 可拖动。
我的问题是,当我在拖动后释放鼠标时,调用鼠标单击的方法并打开对话框。有没有办法区分这两个事件(即拖动时,不要调用点击)?
或者是切换到不同组件(按钮)的唯一方法,以便我可以区分 MouseEvent 和 ActionEvent?
也许通过使用另一个事件处理程序或过滤器,首先是特定的而不是通用的。
StackPane root = new StackPane();
root.addEventFilter(MouseEvent.MOUSE_PRESSED,
new EventHandler<MouseEvent>() {
@Override
public void handle(final MouseEvent event) {
if(event.getEventType() == MouseEvent.MOUSE_PRESSED)
//do something
}
});
// or using MouseEvent.ANY in another eventhandler.
// registering an own eventdispatcher.
对任何 MouseEvent
使用一个 EventHandler
并在发生拖动时过滤点击事件。例如:
public class MyHandler implements EventHandler<MouseEvent> {
private final EventHandler<MouseEvent> onDraggedEventHandler;
private final EventHandler<MouseEvent> onClickedEventHandler;
private boolean dragging = false;
public Handler(EventHandler<MouseEvent> onDraggedEventHandler, EventHandler<MouseEvent> onClickedEventHandler) {
this.onDraggedEventHandler = onDraggedEventHandler;
this.onClickedEventHandler = onClickedEventHandler;
}
@Override
public void handle(MouseEvent event) {
if (event.getEventType() == MouseEvent.MOUSE_PRESSED) {
dragging = false;
}
else if (event.getEventType() == MouseEvent.DRAG_DETECTED) {
dragging = true;
}
else if (event.getEventType() == MouseEvent.MOUSE_DRAGGED) {
//maybe filter on dragging (== true)
onDraggedEventHandler.handle(event);
}
else if (event.getEventType() == MouseEvent.MOUSE_CLICKED) {
if (!dragging) {
onClickedEventHandler.handle(event);
}
}
}
}
然后将其添加到按钮中:
button.addEventHandler(MouseEvent.ANY,
new MyHandler(
e -> System.out.println("Dragged"),
e -> System.out.println("Clicked"))
);
我有多个标签。我有一个 EventHandler<MouseEvent>
在单击标签 (setOnMouseClicked) 时启动一个方法(打开一个对话框)。
不过,我还使用 EventHandler 实现了 setOnMousePressed/setOnMouseDragged 方法,使 Label 可拖动。
我的问题是,当我在拖动后释放鼠标时,调用鼠标单击的方法并打开对话框。有没有办法区分这两个事件(即拖动时,不要调用点击)? 或者是切换到不同组件(按钮)的唯一方法,以便我可以区分 MouseEvent 和 ActionEvent?
也许通过使用另一个事件处理程序或过滤器,首先是特定的而不是通用的。
StackPane root = new StackPane();
root.addEventFilter(MouseEvent.MOUSE_PRESSED,
new EventHandler<MouseEvent>() {
@Override
public void handle(final MouseEvent event) {
if(event.getEventType() == MouseEvent.MOUSE_PRESSED)
//do something
}
});
// or using MouseEvent.ANY in another eventhandler.
// registering an own eventdispatcher.
对任何 MouseEvent
使用一个 EventHandler
并在发生拖动时过滤点击事件。例如:
public class MyHandler implements EventHandler<MouseEvent> {
private final EventHandler<MouseEvent> onDraggedEventHandler;
private final EventHandler<MouseEvent> onClickedEventHandler;
private boolean dragging = false;
public Handler(EventHandler<MouseEvent> onDraggedEventHandler, EventHandler<MouseEvent> onClickedEventHandler) {
this.onDraggedEventHandler = onDraggedEventHandler;
this.onClickedEventHandler = onClickedEventHandler;
}
@Override
public void handle(MouseEvent event) {
if (event.getEventType() == MouseEvent.MOUSE_PRESSED) {
dragging = false;
}
else if (event.getEventType() == MouseEvent.DRAG_DETECTED) {
dragging = true;
}
else if (event.getEventType() == MouseEvent.MOUSE_DRAGGED) {
//maybe filter on dragging (== true)
onDraggedEventHandler.handle(event);
}
else if (event.getEventType() == MouseEvent.MOUSE_CLICKED) {
if (!dragging) {
onClickedEventHandler.handle(event);
}
}
}
}
然后将其添加到按钮中:
button.addEventHandler(MouseEvent.ANY,
new MyHandler(
e -> System.out.println("Dragged"),
e -> System.out.println("Clicked"))
);