JavaFX无法使GridPane适合BorderPane的中心

时间:2016-04-29 23:37:26

标签: java javafx gridpane borderpane

我正在使用数独应用程序,但我遇到的问题阻碍了我的进步。我想要做的就是制作这个我用循环创建的数独板,它将一个Label添加到StackPane中,然后StackPane进入GridPane的指定位置。因此,我试图强制这个电路板具有一定的尺寸,并且不会超过这一点。

我花了整整一个晚上研究和尝试不同的事情,例如将GridPane放入AnchorPane并尝试将AnchorPane放在BorderPane的中心,但它似乎总是超出窗外,你为sudoku棋盘使用了太多的行和列。

我尝试做的是为所有电路板设置一个固定尺寸,因此如果需要,它会被拉伸到那一点,或者如果需要它会缩小。附图中使用的是BorderPane,中间放置了一个GridPane。您可以看到16x16完全适合,而25x25只是在窗外。

帮助将受到高度赞赏。

尝试创建25x25时窗口的图示。

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

尝试创建16x16时窗口的图示。 这也是使用插入物将它推向顶部,因此它看起来不太合适。

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

1 个答案:

答案 0 :(得分:1)

您需要做的就是设置网格约束以满足您的需求。为此,请将Labels放入GridRow(不需要StackPane)并将其vAlignment和hAlignment设置为Center。然后将标签的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);
    }
}