2016-11-15 9 views
2

私は同じサイズの2次元配列からのデータを表し、ScrollPaneに配置されているので、周囲をパンするのに使うことができる均一なサイズの正方形の20x20 GridPaneです。 GridPaneのピクセルの幅と高さの両方は、ScrollPaneのそれぞれのサイズよりもはるかに大きいです。ScrollPaneビューポートの中央グリッドスクエア

私の問題は、指定された座標のセットにあるGridPaneの正方形のScrollPaneのビューポートを中心にする機能的な方法を作ることができなかったことです。

私が利用しようとしているscrollPane.setHvalue(double)scrollPane.setVvalue(double)の私の理解は、それらに渡されるdouble値がスクロールを設定する軸のパーセンテージであるということです。

private void centerViewOn(double x, double y){ 
    scrollPane.setHvalue(x/grid.getDimensionX()); 
    scrollPane.setVvalue(y/grid.getDimensionY()); 
} 

gridが唯一のクラスのインスタンスである:私はそれを想定したコードを書くときしかし、それは四角でも、ビューポート上の任意の場所にされていないと、時々、意図された広場にビューを中央に失敗しましたこの質問との関連性は、グリッドの寸法を持ち、double xdouble yは、中央揃えされた四角形のGridPaneのx、y座標です。

私は間違っていますが、どうすればこの問題を解決できますか?

EDIT:スクロールペインの水平スクロール値はscrollPane.getHmin()scrollPane.getHmax()の間で変動し

private ScrollPane scrollPane; 
private GridPane gridPane; 
private double dimensionX; 
private double dimensionY; 

@Override 
public void start(Stage primaryStage) { 
    scrollPane = new ScrollPane(); 
    gridPane = new GridPane(); 
    dimensionX = 20; 
    dimensionY = 20; 

    Pane temp; 
    for(int x = 0; x < dimensionX; ++x){ 
     for(int y = 0; y < dimensionY; ++y){ 
      temp = new Pane(); 
      temp.setPrefSize(100, 100); 
      temp.setOnMouseClicked(e -> { 
       centerViewOn(GridPane.getColumnIndex((Pane)e.getSource()), GridPane.getRowIndex((Pane)e.getSource())); 
       ((Pane)e.getSource()).setStyle("-fx-background-color: blue"); 
      }); 
      gridPane.add(temp, x, y); 
     } 
    } 

    gridPane.setGridLinesVisible(true); 
    scrollPane.setContent(gridPane); 

    primaryStage.setScene(new Scene(scrollPane)); 
    primaryStage.show(); 
} 

private void centerViewOn(double x, double y){ 
    double viewportWidth = scrollPane.getViewportBounds().getWidth(); 
    double maxHscrollPixels = gridPane.getWidth() - viewportWidth; 
    double hscrollPixels = viewportWidth/2 - (x + 0.5) * dimensionX/20; 
    scrollPane.setHvalue(hscrollPixels/maxHscrollPixels); 

    double viewportHeight = scrollPane.getViewportBounds().getHeight(); 
    double maxVscrollPixels = gridPane.getHeight() - viewportHeight; 
    double vscrollPixels = viewportHeight/2 - (y + 0.5) * dimensionY/20; 
    scrollPane.setVvalue(vscrollPixels/maxVscrollPixels); 
} 
+0

、あなたは彼らがスクロールを停止したときに '' ScrollPane'がgrid'のビューを中央にしたいですか? –

答えて

3

: James_Dの提案に従い、私は、最小限の完全な、かつ検証例として、私が作ったものを含めています。それらは任意の単位であり、ピクセル単位でスクロールされる量は範囲全体にわたって線形に補間されます。

ピクセル単位の可能な水平スクロール量は、ゼロから(グリッドペイン幅 - スクロールペインのビューポート幅)の範囲です。

ですから、

(hvalue - hmin)/(hmax - hmin) = scrollPixels/(gridPaneWidth - viewportWidth) 

を持っているので、いくつかの代数の後には、各列を想定し

hvalue = hmin + (hmax - hmin) * scrollPixels/(gridPaneWidth - viewportWidth) 

を取得するには、同じ幅で、dimensionXの列がある、x列は全体の幅x * gridPaneWidth/dimensionXピクセルを持っています。セルの中心にスクロールし、別のハーフセルを追加したいので、セルの中心をビューポートの中心にしたいので、viewportWidth/2を引いてください。だからあなたは持っている:

hscrollPixels = (x + 0.5) * gridPane.getWidth()/dimensionX - viewportWidth/2 

垂直にスクロールすることは全く同じです。 hminhmaxため

デフォルト値は、それぞれ01、あるので、あなたは、これらが変化しないと仮定した場合、あなたは、物事を少し簡略化することができます。彼らは、エッジに近すぎる場合、彼らは中央のできるだけ近くにスクロールされます。

だから私はあなたがいないすべてのセルが中央にスクロールすることができ

private void centerViewOn(double x, double y){ 
    double viewportWidth = scrollPane.getViewportBounds().getWidth(); 
    double maxHscrollPixels = gridPane.getWidth() - viewportWidth; 
    double hscrollPixels = (x + 0.5) * gridPane.getWidth()/dimensionX - viewportWidth/2; 
    scrollPane.setHvalue(hscrollPixels/maxHscrollPixels); 

    double viewportHeight = scrollPane.getViewportBounds().getHeight(); 
    double maxVscrollPixels = gridPane.getHeight() - viewportHeight; 
    double vscrollPixels = (y + 0.5) * gridPane.getHeight()/dimensionY - viewportHeight/2; 
    scrollPane.setVvalue(vscrollPixels/maxVscrollPixels); 
} 

ノートで終わると思いますスクロールペインは空白を許可しません(コンテンツがビューポートより小さい場合を除きます)。ここで

は完全な例です:だから

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 

public class ScrollToCenter extends Application { 

    private ScrollPane scrollPane; 
    private GridPane gridPane; 
    private double dimensionX; 
    private double dimensionY; 

    @Override 
    public void start(Stage primaryStage) { 
     scrollPane = new ScrollPane(); 
     gridPane = new GridPane(); 
     dimensionX = 20; 
     dimensionY = 20; 

     for(int x = 0; x < dimensionX; ++x){ 
      for(int y = 0; y < dimensionY; ++y){ 
       Pane temp = new Pane(); 
       temp.setPrefSize(100, 100); 
       temp.setOnMouseClicked(e -> { 
        centerViewOn(GridPane.getColumnIndex(temp), GridPane.getRowIndex(temp)); 
        temp.setStyle("-fx-background-color: blue"); 
       }); 
       gridPane.add(temp, x, y); 
      } 
     } 

     gridPane.setGridLinesVisible(true); 
     scrollPane.setContent(gridPane); 

     primaryStage.setScene(new Scene(scrollPane)); 
     primaryStage.show(); 
    } 

    private void centerViewOn(double x, double y){ 
     double viewportWidth = scrollPane.getViewportBounds().getWidth(); 
     double maxHscrollPixels = gridPane.getWidth() - viewportWidth; 
     double hscrollPixels = (x + 0.5) * gridPane.getWidth()/dimensionX - viewportWidth/2; 
     scrollPane.setHvalue(hscrollPixels/maxHscrollPixels); 

     double viewportHeight = scrollPane.getViewportBounds().getHeight(); 
     double maxVscrollPixels = gridPane.getHeight() - viewportHeight; 
     double vscrollPixels = (y + 0.5) * gridPane.getHeight()/dimensionY - viewportHeight/2; 
     scrollPane.setVvalue(vscrollPixels/maxVscrollPixels); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

これは役に立ちましたが、最終的にはうまく機能しませんでした。これは、 'grid.getDimensionX()'の説明がうまくいかなかったためです。明確にするために、このメソッドはグリッド内の列数を返します。この例では20です。 (これは、最終的にグリッドのサイズを変更する機能を実装するため、ハードコードされた数値ではなくメソッドなので、任意の数の行と列のグリッドに対応するソリューションを探しています) – narf0708

+0

@ narf0708おそらく最も良い賭け[MCVE]を作成してそれを含む質問を編集することです。 –

+0

'hmin'と' hmax'をデフォルト値のままにしておきます。正しく読めば、最後の行は 'scrollPane.setHvalue(hscrollPixels/maxHscrollPixels);'に簡素化されるはずです また、私はあなたの番号のいくつかがどこから来ているのか分かりません。 'viewportWidth/2 - (x + 0.5)'の2と0.5の目的は何ですか? – narf0708

関連する問題