【问题标题】:JavaFX: differentiate between click and click-draggedJavaFX:区分单击和单击拖动
【发布时间】:2016-12-10 19:38:35
【问题描述】:

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

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

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

【问题讨论】:

  • *排版错字(即拖动时,不要调用click)
  • Edit你的问题来修正错字。

标签: java javafx eventhandler


【解决方案1】:

为任何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"))
                       );

【讨论】:

    【解决方案2】:

    也许通过使用另一个事件处理程序或过滤器,首先是特定的而不是通用的。

    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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      相关资源
      最近更新 更多