JavaFX,无法让 GridPane 适合 BorderPane 的中心

JavaFX, can't get GridPane to fit in the center of BorderPane

我正在开发数独应用程序,但遇到了阻碍我进步的问题。我想要做的是制作这个我用循环创建的数独板,它将一个标签添加到 StackPane 中,然后 StackPane 进入它在 GridPane 中的指定位置。所以我试图强制这个板有一个固定的大小,并且不会超过那个点。

我整个晚上都在研究和尝试不同的东西,例如将 GridPane 放入 AnchorPane 并尝试将 AnchorPane 放在 BorderPane 的中心,但它似乎总是超出 window, 当你为数独板使用太多的行和列时。

我想要做的是为所有板设置一个尺寸,因此如果需要它会拉伸到那个点,或者如果需要它会缩小。所附图片使用的是 BorderPane,中间有一个 GridPane。您可以看到 16x16 非常适合,而 25x25 刚好超出 window.

非常感谢您的帮助。

尝试创建 25x25 时 window 的外观图片。

http://i.imgur.com/BrJrpiY.png

尝试创建 16x16 时 window 的外观图片。 这也使用插图将其推向顶部,因此看起来不会太不合适。

http://i.imgur.com/7a0QJx8.jpg

您所要做的就是设置网格约束以满足您的需要。为此,将 Labels 放在 GridRow 中(不需要 StackPane)并将它们的 vAlignment 和 hAlignment 设置为中心。然后设置label的vGrow和hGrow为Priority.ALWAYS

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {

        GridPane gridPane = createMainGrid(2, 2);
        gridPane.setAlignment(Pos.CENTER);
        gridPane.setHgap(10);
        gridPane.setVgap(10);

        Scene scene = new Scene(gridPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private GridPane createMainGrid(int rows, int columns) {
        GridPane grid = new GridPane();

        for (int colIdx = 0; colIdx < columns; colIdx++) {
            for (int rowIdx = 0; rowIdx < rows; rowIdx++) {
                GridPane innerGrid = createGrid(4, 4);
                grid.add(innerGrid, colIdx, rowIdx);
                GridPane.setConstraints(innerGrid, colIdx, rowIdx, 1, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS);
            }
        }
        return grid;
    }

    private GridPane createGrid(int rows, int columns) {
        GridPane grid = new GridPane();

        Random random = new Random();

        for (int colIdx = 0; colIdx < columns; colIdx++) {
            for (int rowIdx = 0; rowIdx < rows; rowIdx++) {
                Label label = new Label(String.valueOf(random.nextInt(rows * columns)));
                label.setMinSize(30, 30);
                label.setAlignment(Pos.CENTER);
                grid.add(label, colIdx, rowIdx);
                GridPane.setConstraints(label, colIdx, rowIdx, 1, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS);
            }
        }
        return grid;
    }

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