GridPane

GridPane 在一个灵活的行和列网格中展示它的孩子。

GridPane 的孩子们

子项可以放在 GridPane 中的任何位置,并且可以跨越多行/列(默认跨度为 1),并且它在网格中的位置由其布局约束定义:

约束 描述
columnIndex 子项布局区域开始的列。
rowIndex 子项布局区域开始的行。
columnSpan 子项布局区域水平跨越的列数。
ROWSPAN 子项布局区域垂直跨越的行数。

不需要预先指定行/列的总数,因为 gridpane 将自动扩展/收缩网格以容纳内容。

将子项添加到 GridPane

为了向 GridPane 添加新的 Nodes,应该使用 GridPane 类的静态方法设置子节点的布局约束,然后将这些子节点添加到 GridPane 实例中。

GridPane gridPane = new GridPane();

// Set the constraints: first row and first column
Label label = new Label("Example");
GridPane.setRowIndex(label, 0);
GridPane.setColumnIndex(label, 0);
// Add the child to the grid
gridpane.getChildren().add(label);

GridPane 提供了组合这些步骤的便捷方法:

gridPane.add(new Button("Press me!"), 1, 0); // column=1 row=0

GridPane 类还提供静态 setter 方法来设置子元素的行和列跨度

Label labelLong = new Label("Its a long text that should span several rows");
GridPane.setColumnSpan(labelLong, 2);
gridPane.add(labelLong, 0, 1);  // column=0 row=1

列和行的大小

默认情况下,行和列的大小将适合其内容。如果需要明确控制行和列大小,可以将 RowConstraintsColumnConstraints 实例添加到 GridPane。添加这两个约束将调整上面的示例,使第一列为 100 像素,第二列为 200 像素长。

gridPane.getColumnConstraints().add(new ColumnConstraints(100));
gridPane.getColumnConstraints().add(new ColumnConstraints(200));

默认情况下,即使网格窗格的大小调整大于其首选大小,GridPane 也会将行/列的大小调整为其首选大小。为了支持动态列/行大小,两个 contstaints 类都提供三个属性:最小大小,最大大小和首选大小。

另外 ColumnConstraints 提供 setHGrowRowConstraints 提供 setVGrow 方法来影响生长和收缩的优先级。三个预定义的优先事项是:

  • Priority.ALWAYS :总是尝试增长(或缩小),与其他具有增长(或缩小)总体的布局区域共享空间的增加(或减少)
  • Priority.SOMETIMES :如果没有其他布局区域的增长(或收缩)设置为 ALWAYS 或那些布局区域没有吸收所有增加(或减少)的空间,那么将分享空间的增加(或减少)其他布局区域的 SOMETIMES。
  • Priority.NEVER :当区域中可用空间增加(或减少)时,布局区域永远不会增长(或缩小)。
ColumnConstraints column1 = new ColumnConstraints(100, 100, 300);
column1.setHgrow(Priority.ALWAYS);

上面定义的列具有 100 像素的最小尺寸,并且它总是会尝试增长,直到达到其最大 300 像素宽度。

还可以为行和列定义百分比大小。以下示例定义了一个 GridPane,其中第一列填充网格面板宽度的 40%,第二列填充 60%。

GridPane gridpane = new GridPane();
ColumnConstraints column1 = new ColumnConstraints();
column1.setPercentWidth(40);
ColumnConstraints column2 = new ColumnConstraints();
column2.setPercentWidth(60);
gridpane.getColumnConstraints().addAll(column1, column2);

网格单元内元素的对齐

Nodes 的排列可以通过使用 ColumnConstraints 类的 setHalignment(水平)方法和 RowConstraints 类的 setValignment(垂直)方法来定义。

ColumnConstraints column1 = new ColumnConstraints();
column1.setHalignment(HPos.RIGHT);

RowConstraints row1 = new RowConstraints();
row1.setValignment(VPos.CENTER);