동일한 크기의 2 차원 배열에서 데이터를 나타내는 균일 한 크기의 사각형 20x20 GridPane
을 ScrollPane
에 배치하여 주변에서 사용할 수 있도록했습니다. GridPane
의 너비와 높이 (픽셀)는 모두 ScrollPane
의 각 치수보다 훨씬 큽니다.ScrollPane의 중심 GridPane 사각형 뷰포트
제 문제는 ScrollPane
의 뷰포트를 지정된 좌표 집합에있는 GridPane
사각형에 센터링하는 기능적 방법을 만들 수 없었습니다. 내가 사용하려고 시도 된 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 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'에서보기를 가운데에 맞출 :
여기에 완벽한 예입니다? –