JavaFX:区分单击和单击拖动

san*_*oxj 3 java javafx eventhandler

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

不过,我还使用 EventHandler 实现了 setOnMousePressed/setOnMouseDragged 方法,以使标签可拖动。

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

Bas*_*cil 5

如果发生拖动,则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)