将VBox适合父GridPane

时间:2015-04-16 17:06:19

标签: java javafx vbox gridpane

我有GridPane,它有两列:第一列包含固定大小的ImageView,第二列包含带文本元素的VBox。我需要这个VBox来适应列宽。网格具有正确的尺寸,ImageView,但第二列中的VBox适合它包含的文本,而不适合父(网格)。

VBox box = new VBox();
// all three texts can be changed during program execution by user
// (so 'box' width cannot be based on children widths)
box.getChildren().addAll(new Text("1"), new Text("2"), new Text("3"));
box.setStyle("-fx-background-color: red;");

Image image = ...; // image is always 150x150 px
ImageView imgView = new ImageView(image);
GridPane grid = new GridPane();
grid.add(imgView, 0,0);
grid.add(box,1,0);
grid.add(new Text("another content"), 0,1,2,1);

根据给定的例子我想要' box'与网格的第二列具有相同的宽度'宾语。 如何解决这个问题?

enter image description here 带绿色边框的容器:GridPane网格 带浅蓝色边框的容器:VBox盒子 GridPane有红色背景,VBox有粉红色背景。你可以看到它显然不适合它的父宽度。

提前致谢

2 个答案:

答案 0 :(得分:3)

您可以将Hgrow设置为GridPane的子项。将HGrow设置为Always将允许他们占用total width available

由于box是gridPane的子项,因此您可以使用静态方法setHgrow

来应用该属性
GridPane.setHgrow(box, Priority.Always);

对于height的类似问题,您可以使用setVGrow(Node child, Priority value)

答案 1 :(得分:2)

了解首选尺寸

将组件放置在没有其他组件,场景或舞台大小限制的场景中时的默认大小调整机制是将所有组件的大小调整为其首选大小。

来自Scene javadoc

  

场景的大小可以在施工期间由应用程序初始化。如果未指定大小,则场景将根据其内容的首选大小自动计算其初始大小。

按预期工作

您提供的代码正如我所料 - 所有内容都按照首选大小调整。

如评论中所示,没有列的宽度为1000像素,因此您必须拥有一些额外的代码,以确保布局不会按照您的意愿运行。 content

示例程序

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.*;
import javafx.scene.layout.*;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class GridSample extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        VBox box = new VBox();
        box.getChildren().addAll(new Text("1"), new Text("2"), new Text("3"));
        box.setStyle("-fx-background-color: red;");

        Image image = new Image(IMAGE_LOC);
        ImageView imgView = new ImageView(image);
        GridPane grid = new GridPane();
        grid.add(imgView, 0,0);
        grid.add(box, 1, 0);
        grid.add(new Text("another content"), 0,1,2,1);

        stage.setScene(new Scene(grid));
        stage.show();

        System.out.println("Grid width:  " + grid.getWidth());
        System.out.println("Image width: " + imgView.getLayoutBounds().getWidth());
        System.out.println("Box width:   " + box.getWidth());
        final double secondColWidth = 
                grid.getWidth() - imgView.getLayoutBounds().getWidth();
        System.out.println(
                "Width of box matches width of second grid column: " +
                        (box.getWidth() == secondColWidth)
        );
    }

    public static void main(String[] args) {
        launch(args);
    }

    public static final String IMAGE_LOC =
            "http://icons.iconarchive.com/icons/designbolts/thin-download/128/Download-from-Internet-icon.png";
    // icon License: Linkware (Backlink to http://www.designbolts.com required)

}

节目输出

Grid width:  137.0
Image width: 128.0
Box width:   9.0
Width of box matches width of second grid column: true