Java 将VBox安装到父网格窗格

Java 将VBox安装到父网格窗格,java,javafx,vbox,gridpane,Java,Javafx,Vbox,Gridpane,我有GridPane,它有两列:第一列包含固定大小的ImageView,第二列包含带有文本元素的VBox。我需要这个VBox来适应列宽。网格也有正确的尺寸,ImageView,但第二列中的VBox适合它所包含的文本,而不是父级(网格) 根据给定的示例,我希望“box”与“grid”对象的第二列具有相同的宽度。 如何解决这个问题 带绿色边框的容器:GridPane grid 浅蓝色边框的容器:VBox box GridPane具有红色背景,VBox具有粉色背景。您可以看到,它显然不适合它的父宽度

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

根据给定的示例,我希望“box”与“grid”对象的第二列具有相同的宽度。 如何解决这个问题

带绿色边框的容器:GridPane grid 浅蓝色边框的容器:VBox box GridPane具有红色背景,VBox具有粉色背景。您可以看到,它显然不适合它的父宽度

提前感谢

了解首选尺码

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

从:

在构建过程中,应用程序可以初始化场景的大小。如果未指定大小,场景将根据其内容的首选大小自动计算其初始大小

工作如期进行

您提供的代码正如我所期望的那样工作—所有内容的大小都符合首选大小

没有一列的宽度如您的注释中所示为1000像素,因此您必须有一些额外的代码,以确保布局不符合您的要求。

示例程序

程序输出

网格宽度:137.0 图像宽度:128.0 框宽:9.0 框的宽度与第二个网格列的宽度匹配:true
您可以将
Hgrow
设置为GridPane的子级。将
HGrow
设置为
始终
将允许它们占用可用的
总宽度

由于
box
是gridPane的子级,因此可以使用静态方法应用该属性


对于高度
的类似问题,您可以使用。

请提供一个,例如FXML文件(如果您使用FXML)或Java代码(如果您未使用)。编辑内容。我希望现在很清楚,您希望VBox的宽度与
图像视图的宽度相同吗?第二列是什么?根据提供的代码,VBox在第二列。我不相信您不理解我的问题。恐怕我不能使它更简单。。。第二列是GridPane的列,其中嵌套了VBox(grid.add(box,1,0);)。我希望VBox具有与此列相同的宽度。令人惊讶的是,我所说的列的宽度约为1000px,但放在其中的VBox的宽度为500px,因为它的宽度适合它所包含的文本对象。@PawełWójcik进行设置
GridPane.setHgrow(框,Priority.Always)为你工作?谢谢你的关注和帮助,我发现你的答案也很有用
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);
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
GridPane.setHgrow(box, Priority.Always);