1

截屏

我正在尝试创建一张以后可以打印的发票。我正在使用 VBoxes 和 GridPanes 来做到这一点。中间 GridPane 中的列数是可变的。我正在使用循环构建它。我尝试了许多不同的方法来使 GridPane(绿色边框)跨越整个 VBox(红色边框),但似乎没有任何效果。

给出边界后,我意识到网格实际上跨越了整个 VBox,但列并没有占据整个空间。我不能给出列约束,因为我不知道中间网格的列数,我必须保持在 500 像素以下。

下面是相关代码。

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;
}
4

1 回答 1

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

来到你的关心,

我不能给出列约束,因为我不知道中间网格的列数,我必须保持在 500 像素以下。

好吧,您不需要跟踪列数,hgrow 只有在有额外空间可用时才允许孩子成长。

于 2015-07-27T09:05:47.390 回答