Cześć! Napisałem program coś w stylu Google Maps do przybliżania i przesuwania obrazu w JavaFX. Mój obrazek pakuję do komponentu ScrollPane. Rzeczy, które chcę zmienić to to żeby przybliżanie nie odbywało się ciągle względem środka obrazka lecz odpowiednio do położenia myszki (tak jak we wspomnianym Google Maps).
Mam również problem związany z wielkością obrazów wejściowych. Jeżeli obraz jest rozmiaru A4 lub minimalnie większy to w zasadzie wszystko działa w porządku lecz program musi również obsługiwać obrazy wielkości map (>8*A4). I tutaj w pewnym momencie gdy przybliżę dwu lub trzykrotnie obraz traci się funkcja przesuwania po obrazie. Gdzie mam błąd i jak to naprawić?

Image image = imageView.getImage();
scrollPane.setPrefViewportWidth(0d);
scrollPane.setPrefViewportHeight(0d);
imageView.setFitWidth(0d);
imageView.setFitHeight(0d);
Bounds viewportBounds = scrollPane.getViewportBounds();
boolean vertical = image.getWidth() > image.getHeight();
if (imageView.getRotate() == 90 || imageView.getRotate() == 270d) {
  vertical = !vertical;
}

imageView.setPreserveRatio(true);
double propX = viewportBounds.getWidth() / image.getWidth();
double propY = viewportBounds.getHeight() / image.getHeight();
boolean xLead = !(propX > propY);
imageView.setScaleX((xLead) ? propX : propY);
imageView.setScaleY((xLead) ? propX : propY);
scrollPane.setContent(imageView);

scrollPane.setPannable(true);

scrollPane.setHvalue(scrollPane.getHmin() + (scrollPane.getHmax() - scrollPane.getHmin()) / 2);     // center the scroll contents.
scrollPane.setVvalue(scrollPane.getVmin() + (scrollPane.getVmax() - scrollPane.getVmin()) / 2);

zoom(imageView);

private void zoom(ImageView imagePannable) {
imagePannable.setOnScroll(
        new EventHandler<ScrollEvent>() {
  @Override
  public void handle(ScrollEvent event) {
    double zoomFactor = 1.20;
    double deltaY = event.getDeltaY();

    if (deltaY < 0) {
      zoomFactor = 0.80;
    }
    imagePannable.setScaleX(imagePannable.getScaleX() * zoomFactor);
    imagePannable.setScaleY(imagePannable.getScaleY() * zoomFactor);
    event.consume();
  }
});