Search code examples
androidscrolljavafx-2gridpane

JavaFX on Android - GridPane pan/scroll standard way not working


I use JavaFX on Android (latest version for JDK7).

Does anyone here has experience with scrolling GridPane on touchscreen? I can zoom fully functional with code following:

    gridPane.setOnZoom(new EventHandler<ZoomEvent>() {

        @Override
        public void handle(ZoomEvent event) {

            gridPane.setScaleX(gridPane.getScaleX() * event.getZoomFactor());
            gridPane.setScaleY(gridPane.getScaleY() * event.getZoomFactor());

            event.consume();
        }
    });

I tried to get panning with every possible event I think including the one from JavaFX documentation (http://docs.oracle.com/javafx/2/events/touch_events.htm):

    gridPane.setOnScroll(new EventHandler<ScrollEvent>() {

        @Override
        public void handle(ScrollEvent event) {

            if (!event.isInertia()) {

                gridPane.setTranslateX(gridPane.getTranslateX() + event.getDeltaX());
                gridPane.setTranslateY(gridPane.getTranslateY() + event.getDeltaY());
            }         

            event.consume();
        }
    });

Unfortunately when I run the app and try to pan with my finger nothing happens. Is this a bug, is something in my code wrong or should I use completely different technique for this?

Thank you very much.


Solution

  • I made it with implementing MOUSE_PRESSED and MOUSE_DRAGGED event filter:

    private class DeltaDistance { 
    
        double x;
        double y;
    }
    
    private final DeltaDistance gridPaneDeltaTranslate = new DeltaDistance();
    
    gridPane.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
    
        @Override
        public void handle(MouseEvent event) {
    
            paneDragX = gridPane.getLayoutX() - event.getSceneX();
            paneDragY = gridPane.getLayoutY() - event.getSceneY();
    
            System.out.println("MousePressed" + "\t" + event.getX() + " " + event.getY());  
    
            event.consume();
        }
    });
    
    gridPane.addEventFilter(MouseEvent.MOUSE_DRAGGED, new EventHandler<MouseEvent>() {
    
        @Override
        public void handle(MouseEvent event) {
    
            gridPane.setLayoutX(event.getSceneX() + paneDragX);
            gridPane.setLayoutY(event.getSceneY() + paneDragY);
    
            System.out.println("MouseDragged" + "\t" + event.getX() + " " + event.getY());              
    
            event.consume();
        }
    });
    

    Nevertheless the question still remains but now more for curiosity when I have working solution. Also it could be more elegant than current solution. So far, I accept my answer until someone comes with better one.