GridPane没有跨越整个VBox

时间:2015-07-27 07:48:16

标签: java javafx vbox gridpane

Screenshot

我正在尝试创建一张我可以稍后打印的发票。我使用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;
}

1 个答案:

答案 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只允许孩子成长。