2

我有 GridPane,它有两列:第一列包含固定大小的 ImageView,第二列包含带有 Text 元素的 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);

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

在此处输入图像描述 绿色边框的容器:GridPane grid 浅蓝色边框的容器:VBox box GridPane 有红色背景,VBox 有粉红色背景。您可以看到它显然不适合它的父宽度。

提前致谢

4

2 回答 2

3

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

作为boxgridPane 的子项,您可以使用静态方法应用属性setHgrow

GridPane.setHgrow(box, Priority.Always);

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

于 2015-04-17T08:06:32.510 回答
2

了解首选尺寸

当组件被放置在没有额外组件、场景或舞台尺寸限制的场景中时,默认的尺寸调整机制是将所有组件调整为它们的首选尺寸。

场景 javadoc

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

按预期工作

您提供的代码按我的预期工作 - 所有内容都调整为首选大小。

如您的评论中所示,没有一列是 1000 像素宽,因此您必须有一些额外的代码来确保布局不会像您希望的那样运行。 内容

示例程序

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)

}

程序输出

网格宽度:137.0
图像宽度:128.0
箱宽:9.0
框的宽度与第二个网格列的宽度匹配:true
于 2015-04-16T21:23:38.297 回答