san*_*oxj 3 java javafx eventhandler
我有多个标签。我有一个EventHandler<MouseEvent>在单击标签(setOnMouseClicked)时启动一个方法(打开一个对话框)的方法。
不过,我还使用 EventHandler 实现了 setOnMousePressed/setOnMouseDragged 方法,以使标签可拖动。
我的问题是,当我在拖动后释放鼠标时,将调用鼠标单击的方法并打开对话框。有没有办法区分这两个事件(即拖动时,不调用单击)?或者是切换到不同组件(按钮)以便我可以区分 MouseEvent 和 ActionEvent 的唯一方法?
如果发生拖动,则EventHandler对任何事件使用一个并过滤单击事件。MouseEvent例如 :
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后将其添加到按钮:
button.addEventHandler(MouseEvent.ANY,
new MyHandler(
e -> System.out.println("Dragged"),
e -> System.out.println("Clicked"))
);
Run Code Online (Sandbox Code Playgroud)