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);