【发布时间】:2023-12-06 06:49:01
【问题描述】:
我有一个 20x20 GridPane 的均匀大小的正方形,它表示来自相同大小的二维数组的数据,放置在 ScrollPane 中,这样人们就可以使用它来平移。 GridPane 的宽度和高度(以像素为单位)都远大于 ScrollPane 各自的尺寸。
我的问题是我无法创建一个函数方法,将 ScrollPane 的视口集中在位于一组指定坐标的 GridPane 正方形上。
我对 scrollPane.setHvalue(double) 和 scrollPane.setVvalue(double) 的理解是,我一直在尝试使用它们传递给它们的双精度值是它设置滚动到的轴的百分比。但是,当我假设编写代码时,它无法将视图集中在预期的正方形上,有时正方形甚至不在视口上的任何位置:
private void centerViewOn(double x, double y){
scrollPane.setHvalue(x/grid.getDimensionX());
scrollPane.setVvalue(y/grid.getDimensionY());
}
其中grid 是一个类的实例,它与这个问题唯一相关的是它具有网格的尺寸,double x 和double y 是正方形的 GridPane 中的 x,y 坐标旨在居中。
我做错了什么,我该如何解决?
编辑: 根据 James_D 的建议,我将我所做的作为最小、完整和可验证的示例包括在内:
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);
}
【问题讨论】:
-
那么,当
ScrollPane停止滚动时,您希望grid的视图居中?
标签: java javafx centering scrollpane gridpane