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

标签 java javafx gridpane borderpane

我正在开发一个数独应用程序,但我遇到了一个阻碍我进步的问题。我想做的是制作我用循环创建的数独板,它将标签添加到 StackPane 中,并且 StackPane 进入 GridPane 中的指定位置。因此,我试图强制该板具有设定的尺寸,并且不会超出该尺寸。

我花了整个晚上研究和尝试不同的事情,例如将 GridPane 放入 AnchorPane 并尝试将 AnchorPane 放在 BorderPane 的中心,但当您使用时,它似乎总是超出窗口之外数独板的行和列太多。

我想要做的是为所有板设置一个固定尺寸,因此如果需要,它会拉伸(stretch)到该点,或者如果需要,它会收缩。所附图片使用 BorderPane,中间放置 GridPane。您可以看到 16x16 非常适合,而 25x25 则刚好超出了 window 范围。

我们将非常感谢您的帮助。

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

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

尝试创建 16x16 时窗口的外观图片。 这还使用插图将其推向顶部,这样它看起来就不会太不合适。

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

最佳答案

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

关于JavaFX,无法让 GridPane 适合 BorderPane 的中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36949054/

相关文章:

java - 将字符串写入 jTextField 问题

java - 计算星期误差

java - Hibernate 和 postgresql bigserial - 非顺序

css - JavaFX SetText CSS 选项

java - 如何在 JavaFX 中扩展 GridPane 以覆盖 add() 会导致 NPE、场景生成器中断

java - GAE 不接受 Jersey 的 WebApplicationException

java - 基于 JavaFX 中 TableRow 中对象属性的自定义单元格操作

java - 是否可以使用 Bindings API 将 ObservableList 的非空状态绑定(bind)到 ObjectProperty 中?

java - 在 javafx 中的 gridpane 中的 Pane 上放置标签