いくつかのサブノードを持つ巨大なAnchorPane
がScrollPane
のコンテンツであるとすれば、現在のビューポートの外にあるサブノードの1つを表示するにはどうすればよいですか?ScrollPaneのコンテンツ内のNodeをスクロールして表示する方法はありますか?
7
A
答えて
10
この内部ノードの座標はcontent
であり、それに応じてScrollPane
のvValue
とhValue
を調整する必要があります。私はこのような場合のために少しよりエレガントなバージョンを作成し
public class ScrollPaneEnsureVisible extends Application {
private static final Random random = new Random();
private static void ensureVisible(ScrollPane pane, Node node) {
double width = pane.getContent().getBoundsInLocal().getWidth();
double height = pane.getContent().getBoundsInLocal().getHeight();
double x = node.getBoundsInParent().getMaxX();
double y = node.getBoundsInParent().getMaxY();
// scrolling values range from 0 to 1
pane.setVvalue(y/height);
pane.setHvalue(x/width);
// just for usability
node.requestFocus();
}
@Override
public void start(Stage primaryStage) {
final ScrollPane root = new ScrollPane();
final Pane content = new Pane();
root.setContent(content);
// put 10 buttons at random places with same handler
final EventHandler<ActionEvent> handler = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
int index = random.nextInt(10);
System.out.println("Moving to button " + index);
ensureVisible(root, content.getChildren().get(index));
}
};
for (int i = 0; i < 10; i++) {
Button btn = new Button("next " + i);
btn.setOnAction(handler);
content.getChildren().add(btn);
btn.relocate(2000 * random.nextDouble(), 2000 * random.nextDouble());
}
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
// run once to don't search for a first button manually
handler.handle(null);
}
public static void main(String[] args) { launch(); }
}
9
:
は、次の小さなアプリでensureVisible()
方法を参照してください。しかし、私はy軸でしかテストできませんでした。希望があれば
private static void ensureVisible(ScrollPane pane, Node node) {
Bounds viewport = scrollPane.getViewportBounds();
double contentHeight = scrollPane.getContent().localToScene(scrollPane.getContent().getBoundsInLocal()).getHeight();
double nodeMinY = node.localToScene(node.getBoundsInLocal()).getMinY();
double nodeMaxY = node.localToScene(node.getBoundsInLocal()).getMaxY();
double vValueDelta = 0;
double vValueCurrent = scrollPane.getVvalue();
if (nodeMaxY < 0) {
// currently located above (remember, top left is (0,0))
vValueDelta = (nodeMinY - viewport.getHeight())/contentHeight;
} else if (nodeMinY > viewport.getHeight()) {
// currently located below
vValueDelta = (nodeMinY + viewport.getHeight())/contentHeight;
}
scrollPane.setVvalue(vValueCurrent + vValueDelta);
}
関連する問題
- 1. スクロール表示でuibuttonの代わりにスクロール表示でイメージを追加する方法はありますか?
- 2. JavaFX ScrollPaneをスクロールして、ビューポートの中央にノードを置く方法はありますか?
- 3. httpリンクのコンテンツをフィードに表示する方法はありますか?
- 4. アンドロイドのウィジェット(コンテンツ)のみをスクロールする方法はありますか?
- 5. スクロール時にボタンを隠す方法とスクロール停止時に表示する方法はありますか?
- 6. ワードプレスでスクロールせずにiframeのコンテンツを表示する方法
- 7. libgdxのScrollPaneを即座にスクロールする方法は?
- 8. AndroidスタジオエディタでRecyclerViewのコンテンツのプレビューをGridとして表示する方法はありますか?
- 9. APKからマニフェストファイルの内容を表示する方法はありますか?
- 10. コレクション内の選択したUICollectionViewCellにスクロールする方法はありますか?
- 11. ページをスクロールして要素を非表示にする方法はありますか?
- 12. JavaFX 2.2 - scrollPaneをズームした後にスクロールする方法
- 13. アンドロイドフォトアプリのソースコードを表示する方法はありますか?
- 14. Androidのアクティビティスタックを表示する方法はありますか?
- 15. エレメントをHTMLのプレーンテキストとして表示する方法はありますか?
- 16. 他のコンテンツをスクロールしてUIViewに表示する
- 17. 上にスクロールする方法はありますが、瞬時にスクロールする方法はありませんか?
- 18. アプリでユーザーのアクティビティを表示/表示する方法はありますか?
- 19. 要素のouterHTMLを別の要素の内容として表示する方法はありますか?
- 20. node-gypのソースを表示するためのワイルドカードメカニズムがありますか?
- 21. DRUPALのコンテンツを非表示にしてフロント.......を表示する方法は?
- 22. データベースから「A」ビューにデータを表示する方法と、「codeigniter」内の同じデータを使用して「B」を表示する方法はありますか?
- 23. SurfaceView内にGIFを表示する方法はありますか?
- 24. Xamarinフォーム - 別のXaml内のコンテンツを表示する方法
- 25. ViewPager DecorViewのフラグメントコンテンツをスクロールする方法はありますか?
- 26. コンテンツはスクロールバーを表示しますが、スクロールできません
- 27. wpf(C#)DataGrid ScrollIntoView - 表示されていない最初の行にスクロールする方法はありますか?
- 28. 要素内のテキストとしてリンクのコンテンツを表示する方法
- 29. プロジェクト内のすべての宝石についてドキュメントを表示する方法はありますか?
- 30. ウィジェットのコンテンツをフォーマットする方法はありますか?