2016-12-10 19 views
1

複数のラベルがあります。私はEventHandler<MouseEvent>ラベルをクリックしたとき(setOnMouseClicked)メソッドを起動する(ダイアログを開く)。JavaFX:クリックとクリックの違いを区別する

しかし、EventHandlerを使用してLabelをドラッグ可能にするsetOnMousePressed/setOnMouseDraggedメソッドも実装しました。

私の問題は、ドラッグした後にマウスを離すと、マウスクリックされたメソッドが呼び出され、ダイアログが開きます。これらの2つのイベントを区別する方法はありますか(ドラッグされた場合、クリックしないでください)。 MouseEventとActionEventを区別できるように、別のコンポーネント(Button)に切り替える唯一の方法はありますか?

+0

*ラインのタイプミス(ドラッグすなわちとき、クリックし呼び出すことはありません) – sandboxj

+0

[編集]タイプミスを修正するためにあなたの質問。 –

答えて

1

いずれかを使用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")) 
         ); 
1

おそらく、別のイベントハンドラまたはフィルタを使用して、まず汎用のイベントハンドラまたはフィルタを使用します。任意のMouseEventとフィルタークリックイベントのため

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. 
関連する問題