2016-12-10 1 views
1

여러 라벨이 있습니다. 레이블을 클릭하면 (setOnMouseClicked) 메서드를 시작하는 (대화 상자를 여는) EventHandler<MouseEvent> 있습니다.JavaFX : 클릭과 클릭으로 구분됩니다.

그러나 EventHandler를 사용하여 setOnMousePressed/setOnMouseDragged 메서드를 구현하여 레이블을 드래그 가능하도록 만들었습니다.

내 문제는 마우스를 놓은 상태에서 마우스를 놓으면 클릭 한 메서드가 호출되고 대화 상자가 열리는 것입니다. 이 두 가지 이벤트를 구분할 수있는 방법이 있나요? (예 : 드래그 할 때 클릭을 호출하지 마세요)? 또는 MouseEvent와 ActionEvent를 구별 할 수 있도록 다른 구성 요소 (Button)로 전환하는 유일한 방법은 무엇입니까?

+0

* 줄에 오타 (드래그 할 때 즉, 클릭 호출하지 않습니다) – sandboxj

+0

[편집] 귀하의 질문에 오타를 수정. –

답변

1

는 드래그가 발생합니다. 예를 들어 :

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

아마도 다른 이벤트 처리기 또는 필터를 사용하면 먼저 일반적인 것보다 특정 이벤트 처리기 또는 필터를 사용합니다. 어떤 MouseEvent 및 필터 클릭 이벤트에 대한 하나를 사용 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.