I am developing a JavaFX project and I need something similar to a TouchEvent
that characterizes a "push and hold" event. But It should be mapped as a MouseEvent
because I'm having troubles with touch events on Linux. For instance, in Ubuntu, it won't respond to touch events.
Please, let me know if you have any ideas about how to fire a MouseEvent
whenever a "push and hold" occurs on Linux?
Just use a PauseTransition
as a timer for the "hold". Start it if the mouse is pressed, stop it if it's released or dragged.
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.util.Duration;
public class MousePressAndHoldTest extends Application {
@Override
public void start(Stage primaryStage) {
Pane root = new Pane();
addPressAndHoldHandler(root, Duration.seconds(1),
event -> System.out.println("Press and hold"));
primaryStage.setScene(new Scene(root, 400, 400));
primaryStage.show();
}
private void addPressAndHoldHandler(Node node, Duration holdTime,
EventHandler<MouseEvent> handler) {
class Wrapper<T> { T content ; }
Wrapper<MouseEvent> eventWrapper = new Wrapper<>();
PauseTransition holdTimer = new PauseTransition(holdTime);
holdTimer.setOnFinished(event -> handler.handle(eventWrapper.content));
node.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> {
eventWrapper.content = event ;
holdTimer.playFromStart();
});
node.addEventHandler(MouseEvent.MOUSE_RELEASED, event -> holdTimer.stop());
node.addEventHandler(MouseEvent.DRAG_DETECTED, event -> holdTimer.stop());
}
public static void main(String[] args) {
launch(args);
}
}