0

I want to fire some action when there was NO drag event between mouse pressed and released events. In other words - when user kept his mouse cursor still while clicking. The question is specificly about rective way achive it. Really would appreciate RxJava2 solution (I'm using it with RxJavaFx).

2 Answers2

0
Observable.combineLatest(
            JavaFxObservable.eventsOf(panel1, MouseEvent.DRAG_DETECTED).map(event -> System.currentTimeMillis()).startWith(System.currentTimeMillis()),
            JavaFxObservable.eventsOf(panel1, MouseEvent.MOUSE_PRESSED).map(event -> System.currentTimeMillis()),
            JavaFxObservable.eventsOf(panel1, MouseEvent.MOUSE_RELEASED).map(event -> System.currentTimeMillis()),
            (dragDectedMillis, pressedMillis, releasedMillis) -> releasedMillis > pressedMillis && dragDectedMillis < pressedMillis ? true : false)
    .filter(noDragDetected -> noDragDetected)
    .subscribe(next -> System.out.println("Action"));
0
import io.reactivex.Observable;
import io.reactivex.rxjavafx.observables.JavaFxObservable;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class PressedReleasedWithoutDraggedApp extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        StackPane stackPane = new StackPane();
        stackPane.setPrefSize(800, 600);
        stage.setScene(new Scene(stackPane));
        stage.show();

        Observable<MouseEvent> mousePressedObservable = JavaFxObservable.eventsOf(stackPane, MouseEvent.MOUSE_PRESSED);
        Observable<MouseEvent> mouseReleasedObservable = JavaFxObservable.eventsOf(stackPane, MouseEvent.MOUSE_RELEASED);
        Observable<MouseEvent> mouseDraggedObservable = JavaFxObservable.eventsOf(stackPane, MouseEvent.MOUSE_DRAGGED);

        mousePressedObservable
        .switchMap(mousePressed -> mouseReleasedObservable.takeUntil(mouseDraggedObservable))
        .subscribe(next -> System.out.println("PRESSED'N'RELEASED without DRAGGED"));
    }
}