JavaFX ScrollPane programmatically moving the viewport - centering content

后端 未结 3 1699
时光取名叫无心
时光取名叫无心 2021-01-05 13:11

I can use the setVvalue(double) and setHvalue(double) methods to move a viewport in a JavaFX ScrollPane. What I\'m struggling to do is center a particular node in the conte

3条回答
  •  灰色年华
    2021-01-05 14:00

    Here is an example on how to center a pic that has been rotated. The code is in Scala and therefore applicable to ScalaFX, but JavaFX and Java developers will be able to read/use it :

      def turnPic(angle:Int) {
        val virtualSurfaceMultiplier = 8.0;
        currentAngle = ( floor((currentAngle % 360) / 90) * 90 + angle + 360 ) % 360;
        imageView.rotate = currentAngle;
        val orientationSwitched = (currentAngle / 90) % 2 > 0;
        val width= scrollPane.getViewportBounds().getWidth();
        val height= scrollPane.getViewportBounds().getHeight();
        val viewPort = new Rectangle2D(0, 0, image.width.value, image.height.value);
        imageView.setViewport(viewPort);
        imageView.fitHeight.value = virtualSurfaceMultiplier * height;
        imageView.fitWidth.value = 0 //virtualSurfaceMultiplier * width;
        def centerV(picHeight:Double) {
          val node  = scrollPane.getContent();
          val totalHeight = scrollPane.getContent().getBoundsInLocal().getHeight();
          val offsetToCenter = (node.getBoundsInParent().getMaxY() + node.getBoundsInParent().getMinY()) / 2.0;
          val viewportWidth = scrollPane.getViewportBounds().getHeight();
          val res = (scrollPane.getVmax() * ((offsetToCenter - 0.5 * picHeight * zoomFactor) / (totalHeight - picHeight * zoomFactor)));
          scrollPane.setVvalue(res);
        }
        def centerH(picWidth:Double) {
          val node  = scrollPane.getContent();
          val totalWidth = scrollPane.getContent().getBoundsInLocal().getWidth();
          val offsetToCenter = (node.getBoundsInParent().getMaxX() + node.getBoundsInParent().getMinX()) / 2.0;
          val viewportWidth = scrollPane.getViewportBounds().getWidth();
          val res = (scrollPane.getHmax() * ((offsetToCenter - 0.5 * picWidth * zoomFactor) / (totalWidth - picWidth * zoomFactor)));
          scrollPane.setHvalue(res);
          System.err.println(s"trace centerH> $FILE:$LINE:" + " totalWidth:" + totalWidth + " offsetToCenter=" + offsetToCenter + " vWidth=" + viewportWidth + "res=" + res);
        }
        if (orientationSwitched) {
          zoomFactor = 1.0 / (virtualSurfaceMultiplier * image.width.value / image.height.value);
          centerH(height);
          centerV(width);
        }
        else
        {
          zoomFactor = 1.0 / virtualSurfaceMultiplier;
          centerH(width);
          centerV(height);
        }
        imageView.setScaleX(zoomFactor);
        imageView.setScaleY(zoomFactor);
      }
    

提交回复
热议问题