8

setVvalue(double) および setHvalue(double) メソッドを使用して、JavaFX ScrollPane 内のビューポートを移動できます。私が苦労しているのは、特定のノードをその位置に基づいてスクロール ペインのコンテンツの中央に配置することです。localToScene() と boundsInParent() のあらゆる種類の組み合わせを試しました。私は(たくさん)読んで、この例を見ました

ScrollPaneのコンテンツ内のノードを表示するためにスクロールする方法は?

これは近いですが、オブジェクトを中央に配置しないと、オブジェクトが見えるようになります。組み込みのマウス パン機能は素晴らしいですが、プログラムによるパン機能が苦手です。

最終的には、ズームもできるようにする必要があるため、実際の図形をグループに入れ、そのグループをスクロール ペインのコンテンツに追加しました。グループのズームを行うことになっていると思いますが、グループの中心をズームできるようにする必要があるため、現在の中心位置の操作と特定に戻ります。提供できるポインタや例は、本当に感謝しています。上記のリンクのコード サンプルは、優れた SSCCE です。

前もって感謝します、

アンディ

4

3 に答える 3

17

ここでは必要ないと思うので、コードなしで説明してみます。

スクロールペインのコンテンツhの高さが で、ビューポートの高さが であるとしましょうv。の場合h = v、コンテンツはビューポートに完全に収まり、スクロールバーは必要ありません。この状況 (スクロールバーが動かない場合) で、要素を中央に配置するには、スクロールペインのコンテンツの中央に配置する必要があります。スクロールしてビューポートの中心に移動することはできません。

ここで(つまり)hの 2 倍のサイズであると考えてください。この状況では、スクロールペインのコンテンツの上部 1/4 と下部 1/4 をスクロールしても中央に配置できませんでした。vh = 2v

(どうしてもコンポーネントをスクロールして中央に配置する必要がある場合は、コンテンツ ペインのパディングを検討する必要がありますが、ここではパディングなしのソリューションを続けます)

考えてみると、スクロールバーの可能なスクロール距離は であることがわかります。1.0h - vに設定することで、その量をスクロールしますvvalue

ポイントを中央に配置するyには (ここで、ポイント y はスクロールペインのコンテンツ ペインの座標です)、次の vvalue を使用できます。

vvalue = (y - 0.5 * v) / (h - v) 

この式の分子は、点 y がビューポートの中心にあるときにビューポートの上部に表示されるものの y 座標です。分母は、スクロール可能な距離の合計です。

編集:とにかくコードを追加してください!

public void centerNodeInScrollPane(ScrollPane scrollPane, Node node) {
    double h = scrollPane.getContent().getBoundsInLocal().getHeight();
    double y = (node.getBoundsInParent().getMaxY() + 
                node.getBoundsInParent().getMinY()) / 2.0;
    double v = scrollPane.getViewportBounds().getHeight();
    scrollPane.setVvalue(scrollPane.getVmax() * ((y - 0.5 * v) / (h - v)));
}

(これは、ノードがスクロールペインのコンテンツペインの直接の子であると仮定していることに注意してください)

お役に立てれば!:)

于 2014-05-07T12:49:25.883 に答える
0

少し遅れていますが、誰かが役に立つと思うかもしれません.:)

センタリングに関しては、これは難しい作業ではなく、ほんの少しの計算が必要です。2 つのことが必要です。ScrollPane のコンテンツ全体のサイズ (スクロール可能な領域の幅と高さ、スクロールバーのあるフレームだけでなく、スクロールバーが存在しないかのように完全なサイズ) および ScrollPane コンテンツ内の中央に配置されたオブジェクトの位置。

次のようなコンテンツのサイズを取得します。scrollPane.getContent().getBoundsInLocal().getHeight() or .getWidth()

オブジェクトの位置: node.getBoundsInParent().getMinY() or .getMinX()- オブジェクトの最小位置。高さと幅も取得できます。

次に、中心の位置を計算し、この式に従ってスクロールバーを移動します。

double vScrollBarPosition = scrollPane.getVMax() * (yPositionOfCenter / heightOfScrollPaneContent)

于 2014-01-23T13:26:21.577 に答える