2016-12-10 130 views
1

我有多個標籤。我有一個EventHandler<MouseEvent>,它在點擊標籤(setOnMouseClicked)時啓動一個方法(打開一個對話框)。JavaFX:區分點擊和點擊拖動

但是,我還使用EventHandler實現了一個setOnMousePressed/setOnMouseDragged方法,使標籤可以拖動。

我的問題是,當我拖動鼠標後釋放鼠標時,鼠標點擊的方法被調用,對話框打開。有沒有辦法區分這兩個事件(即拖動時,不要點擊)? 或者是切換到不同的組件(按鈕)的唯一方法,所以我可以區分MouseEvent和ActionEvent?

+0

*錯字的線(即拖的時候,不叫點擊) – sandboxj

+0

[編輯]你的問題解決了錯字。 –

回答

1

使用一個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); 
      } 
     } 

    } 
} 

然後將其添加到按鈕:

button.addEventHandler(MouseEvent.ANY, 
         new MyHandler(
          e -> System.out.println("Dragged"), 
          e -> System.out.println("Clicked")) 
         ); 
1

也許通過使用另一個事件處理程序或過濾器,首先比通用的一個具體。

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.