2016-10-20 7 views
1

scrollpaneの組み込みパンニングツールの問題で、こんにちは(流動的ではなく、ゆっくりとチャンクに移行します)カスタムパンニングハンドラーを作成しようとしています。以下は私の試みですが、if文が正しく動作しません。カスタムパンニングハンドラーJavafx

mapScroll.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> { 
     startX = e.getX(); 
     startY = e.getY(); 
    }); 
    mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> { 
     endX = e.getX(); 
     endY = e.getY(); 
     Bounds viewBounds = mapScroll.getViewportBounds(); 
     Bounds mapBounds = mapScroll.getBoundsInParent(); 
     double xMin = viewBounds.getMinX(); 
     double xMax = viewBounds.getMaxX(); 
     double yMin = viewBounds.getMinY(); 
     double yMax = viewBounds.getMaxY(); 
     double startEndX = endX - startX; 
     double startEndY = endY - startY; 
     if(mapBounds.contains(xMin + startEndX, yMin + startEndY) && mapBounds.contains(xMin + startEndX, yMax + startEndY) && mapBounds.contains(xMax + startEndX, yMin + startEndY) && mapBounds.contains(xMax + startEndX, yMax + startEndY)) 
     { 
      double fullWidth = mapScroll.getWidth(); 
      double fullHeight = mapScroll.getHeight(); 
      double hChange = startEndX/fullWidth; 
      double vChange = startEndY/fullHeight; 
      mapScroll.setHvalue(mapScroll.getHvalue() + hChange); 
      mapScroll.setVvalue(mapScroll.getVvalue() + vChange); 
     } 
     endX = startX; 
     endY = startY; 
    }); 

答えて

1

計算のコンテンツの幅は決して使用しないでください。つまり、コンテンツのサイズに関係なく、マウスを同じ距離だけ移動させて、一方から他方へスクロールする必要があります。コンテンツがビューポートよりわずか10ピクセル大きいか、コンテンツがビューポートのサイズの10倍であるかは、コードに違いはありません。さらに、イベントフィルタのすべての呼び出しの開始時に値を上書きするため、

は絶対に役に立たないことに注意してください。あなたはおそらく、他の方法で割り当てをしたいと思っていました。

また、マウスの動きと同じ方向にスクロール位置を移動します。ただし、スクロール位置を反対方向に移動する必要があります。

ここで(境界試験を簡単にするために除去される)の例は次のとおり

private double startX; 
private double startY; 

@Override 
public void start(Stage primaryStage) { 
    ImageView image = new ImageView("https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg/687px-Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg"); 
    ScrollPane mapScroll = new ScrollPane(image); 
    Scene scene = new Scene(mapScroll, 400, 400); 
    mapScroll.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> { 
     startX = e.getX(); 
     startY = e.getY(); 
    }); 
    mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> { 
     double endX = e.getX(); 
     double endY = e.getY(); 
     Bounds viewBounds = mapScroll.getViewportBounds(); 

     double startEndX = startX - endX; 
     double startEndY = startY - endY; 

     Bounds contentBounds = mapScroll.getContent().getLayoutBounds(); 

     double hChange = startEndX/(contentBounds.getWidth() - viewBounds.getWidth()); 
     double vChange = startEndY/(contentBounds.getHeight() - viewBounds.getHeight()); 
     mapScroll.setHvalue(mapScroll.getHvalue() + hChange); 
     mapScroll.setVvalue(mapScroll.getVvalue() + vChange); 

     startX = endX; 
     startY = endY; 
    }); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
}