2016-12-10 9 views
1

Ich habe mehrere Labels. Ich habe eine EventHandler<MouseEvent>, die eine Methode startet (öffnet ein Dialogfeld), wenn auf das Label geklickt wird (setOnMouseClicked).JavaFX: differenzieren zwischen klicken und ziehen gezogen

Allerdings habe ich auch eine setOnMousePressed/setOnMouseDragged-Methode mit EventHandler implementiert, um das Label ziehbar zu machen.

Mein Problem ist, wenn ich die Maus nach dem Ziehen freigeben, wird die Methode für Mausklick aufgerufen und der Dialog öffnet sich. Gibt es eine Möglichkeit, diese beiden Ereignisse zu unterscheiden (d. H. Wenn sie gezogen wird, klicken Sie nicht auf "click")? Oder ist die einzige Möglichkeit, zu einer anderen Komponente (Button) zu wechseln, damit ich zwischen MouseEvent und ActionEvent unterscheiden kann?

+0

* Tippfehler in der Leitung (das heißt, wenn gezogen, rufen Sie nicht klicken) – sandboxj

+0

[Bearbeiten] Ihre Frage die Tippfehler zu beheben. –

Antwort

1

Verwenden Sie eine EventHandler für alle MouseEvent und Filter Click-Ereignisse, wenn ein Drag aufgetreten. Zum Beispiel:

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); 
      } 
     } 

    } 
} 

Dann fügen Sie die Schaltfläche:

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

Vielleicht mit einem anderen Eventhandler oder Filter, zuerst eine spezifische als eine generische.

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. 
Verwandte Themen