如何将 pdf 缩放到 javafx 2 中的鼠标位置

How to zoom a pdf to the mouse position in javafx 2

我必须缩放 ScrollPane 内的 pdf 文件。 ScrollPane 本身位于 StackPane 内部。
一开始我缩放我的 pdf 以适应我的 ScrollPane 的宽度。因此 pdf-height 不适合 ScrollPanes 高度。
我已经设法通过在使用鼠标滚轮时更改我的 scaleFactor 来缩放。很遗憾,我无法放大特定点。
我想我必须根据鼠标坐标更改 ScrollPanes 值,但我找不到正确的计算方法。有人可以帮我吗?

例如我试过

scrollPane.setVvalue(e.getY() / scrollPane.getHeight())

使用这行代码,我的视图会向上或向下跳动,具体取决于我是单击视口的上限还是下限。
我也明白它必须表现得像那样,但我无法弄清楚必须 added/changed.

我用Jpedal来显示我的pdf

希望您明白我在寻找什么。 如果您需要更多信息,请告诉我。

编辑:

这是我如何成功拖动的片段。

    eventRegion.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
        dragStartX = e.getX();
        dragStartY = e.getY();
    });

    eventRegion.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> {                     
        double deltaX = dragStartX - e.getX();
        double deltaY = dragStartY - e.getY();

        scrollPane.setHvalue(Math.min(scrollPane.getHvalue() + deltaX / scrollPane.getWidth(), scrollPane.getHmax()));          
        scrollPane.setVvalue(Math.min(scrollPane.getVvalue() + deltaY / scrollPane.getHeight(), scrollPane.getVmax()));                 

        e.consume();
    });

我认为缩放到鼠标位置可以通过类似的方式完成,只需设置 Hvalue 和 Vvalue。
有什么想法可以计算这些值吗?

具有可缩放、可平移 ScrollPane 的 JavaFX 8 代码,可缩放到鼠标指针,重置缩放并适合矩形的宽度,该矩形实际上可以是任何 Node。请务必检查问题的答案以使 fitWidth() 正常工作。我现在正在 ImageView 使用此解决方案,它很灵活。

仅针对有关 "zooming where the mouse is" 的所有相关问题。

我遇到了同样的问题,我想出了以下代码片段。

public void setZoom(final double x, final double y, final double factor) {
    // save the point before scaling
    final Point2D sceneToLocalPointBefore = this.sceneToLocal(x, y);

    // do scale
    this.setScaleX(factor);
    this.setScaleY(factor);

    // save the point after scaling
    final Point2D sceneToLocalPointAfter = this.sceneToLocal(x, y);

    // calculate the difference of before and after the scale
    final Point2D diffMousePoint = sceneToLocalPointBefore.subtract(sceneToLocalPointAfter);

    // translate the pane in order to point where the mouse is 
    this.setTranslateX(this.getTranslateX() - diffMousePoint.getX() * this.getScaleX());
    this.setTranslateY(this.getTranslateY() - diffMousePoint.getY() * this.getScaleY());
}

基本思路是将底层窗格移动到缩放前的位置。重要的是,我们将鼠标位置计算到 Pane 的 local 坐标系。在缩放之后,我们再做一次并计算差异。一旦我们知道了差异,我们就可以将窗格移回。我认为这个解决方案非常简单直接。

我在 JavaFX 中的设置如下:我有一个 javafx.scene.layout.BorderPane 作为我的 javafx.scene.Scene 的根目录。在中心我放了一个窗格。这将是我操作的窗格(即,将其他节点放入..缩放、移动..等)如果有人对我的实际操作感兴趣,请发邮件给我。

好编程!