我正在尝试创建一张我可以稍后打印的发票。我使用VBoxes和GridPanes来完成它。中间GridPane中的列数是可变的。我正在使用循环构建它。我尝试了许多不同的东西来使GridPane(绿色边框)跨越整个VBox(RED边框),但似乎没有任何效果。
在给出边框之后,我意识到网格实际上是跨越整个VBox,但是列并不占据整个空间。由于我不知道中间网格的列数而且我必须保持在500px以下,所以我无法给出列约束。
以下是相关代码。
final int width = 500;
BorderPane borderpane = new BorderPane();
VBox vboxTop = vboxForPrinting('l');
VBox vboxMiddle = vboxForPrinting('r');
VBox vboxBottom = vboxForPrinting('r');
GridPane gridpaneTop = new GridPane();
GridPane gridpaneMiddle = new GridPane();
GridPane gridpaneBottom = new GridPane();
borderpane.setPrefWidth(width);
vboxTop.setFillWidth(true);
vboxMiddle.setFillWidth(true);
vboxBottom.setFillWidth(true);
// Some code
vboxTop.getChildren().add(gridpaneTop);
vboxMiddle.getChildren().add(gridpaneMiddle);
vboxBottom.getChildren().add(gridpaneBottom);
borderpane.setTop(vboxTop);
borderpane.setCenter(vboxMiddle);
borderpane.setBottom(vboxBottom);
函数vboxForPrinting()如下:
public VBox vboxForPrinting(char align) {
VBox vbox = new VBox();
switch (align) {
case 'r':
case 'R':
vbox.setAlignment(Pos.CENTER_RIGHT);
break;
case 'l':
case 'L':
vbox.setAlignment(Pos.CENTER_LEFT);
break;
default:
vbox.setAlignment(Pos.CENTER);
}
vbox.setPadding(new Insets(5));
vbox.setSpacing(5);
vbox.setFillWidth(true);
return vbox;
}
答案 0 :(得分:3)
您可以为网格面板的特定子项应用setHgrow()
,该网格面板将实习生长并占用剩余的可用空间。
来自javadocs:
在网格窗格包含时为子项设置水平增长优先级。如果设置,如果网格面板的大小调整大于其首选宽度,则网格面板将使用优先级来分配子附加水平空间。将值设置为null将删除约束。
GridPane.setHgrow(name, Priority.ALWAYS);
其中,name
是您想要成长的标签,并占据空地的其余部分。
如果您希望所有字段或列都增长,您可以将其应用于所有字段或列,或者您可以创建ColumnConstraints并将其应用于一个/多个列。
以下代码应该有效:
ColumnConstraints columnConstraints = new ColumnConstraints();
columnConstraints.setFillWidth(true);
columnConstraints.setHgrow(Priority.ALWAYS);
gridPane.getColumnConstraints().add(columnConstraints);
引起您的关注,
由于我不知道中间网格的列数而且我必须保持在500px以下,因此我无法给出列约束。
嗯,你不需要跟踪列数,如果有额外的空间,hgrow只允许孩子成长。