JavaFX:区分单击和拖动单击

JavaFX:区分单击和拖动单击,java,javafx,eventhandler,Java,Javafx,Eventhandler,我有多个标签。我有一个EventHandler,它在单击标签(setOnMouseClicked)时启动一个方法(打开一个对话框) 但是,我还使用EventHandler实现了setOnMousePressed/setOnMouseDrawed方法,以使标签可拖动 我的问题是,当我在拖动后释放鼠标时,会调用单击鼠标的方法并打开对话框。是否有办法区分这两个事件(即拖动时,不要调用单击)? 或者是切换到其他组件(按钮)以便区分MouseEvent和ActionEvent的唯一方法?可能需要使用另一个

我有多个标签。我有一个
EventHandler
,它在单击标签(setOnMouseClicked)时启动一个方法(打开一个对话框)

但是,我还使用EventHandler实现了setOnMousePressed/setOnMouseDrawed方法,以使标签可拖动

我的问题是,当我在拖动后释放鼠标时,会调用单击鼠标的方法并打开对话框。是否有办法区分这两个事件(即拖动时,不要调用单击)?
或者是切换到其他组件(按钮)以便区分MouseEvent和ActionEvent的唯一方法?

可能需要使用另一个eventhandler或筛选器,首先是特定的而不是通用的

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.
StackPane root=new StackPane();
root.addEventFilter(MouseEvent.MOUSE_按下,
新的EventHandler(){
@凌驾
公共无效句柄(最终MouseeEvent事件){
if(event.getEventType()==MouseEvent.MOUSE_按下)
//做点什么
}
});
//或者在另一个eventhandler中使用MouseEvent.ANY。
//注册自己的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"))
                       );