2015-05-05 65 views
1

我必須放大ScrollPane內部的pdf文件。 ScrollPane本身在StackPane中。
在開始時,我縮放我的PDF以適應我的ScrollPane的寬度。由於這個pdf高度不適合ScrollPanes高度。
我已經設法縮放,通過改變我的scaleFactor使用鼠標滾輪時。不幸的是我無法放大到一個特定的點。
我想我必須根據鼠標座標更改ScrollPanes值,但我找不到正確的計算。有人能幫幫我嗎?如何將pdf放大到javafx 2中的鼠標位置

比如我試圖

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

有了這行代碼我的觀點只是或跳起來了,這取決於我是否點擊上限或下限我視口。
我也明白它的行爲就像那樣,但我不知道需要添加/更改什麼。

我用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可以以類似的方式縮放鼠標位置。
任何想法我可以如何計算這些值?

回答

1

This example擁有JavaFX 8代碼,可縮放,可平移ScrollPane,可縮放鼠標指針,重置縮放和適合寬度的矩形,實際上可以是任何Node。請務必查看問題的答案,以便fitWidth()正常工作。我現在正在使用此解決方案的ImageView,它很光滑。

+0

是否有必要使用樞軸點?因爲我沒有真正瞭解setPivot()中發生了什麼,你能嘗試向我解釋嗎? – Zydar

+0

是的,這是一種必要的方法。它與'setTranslateX(getTranslateX() - x);'setTranslateY(getTranslateY() - y);''setScale(scale);'實際上是相同的,'除了它使翻譯動畫以使它們看起來更平滑。 – RonSiven

+0

我回答你的問題了嗎?你還有麻煩嗎?我能以任何方式幫助嗎? – RonSiven

1

僅用於所有與有關的問題「縮放鼠標所在的位置」

我有同樣的問題,我想出了以下代碼片段。

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()); 
} 

基本思路是將底層窗格移動到縮放前的位置。重要的是,我們計算鼠標位置爲該窗格的座標系本地。在縮放之後,我們再次做這個並計算差異。一旦我們知道了差異,我們就能夠移回窗格。我認爲這個解決方案非常簡單直接。

我在JavaFX中的設置如下:我有一個javafx.scene.layout.BorderPane作爲我的javafx.scene.Scene的根。在中心我放了一個窗格。這將成爲我採取行動的窗格(即將其他節點放入..zoom,move ..等)。如果有人對我實際上做了什麼感興趣,只需發郵件給我。

很好的編程!