【问题标题】:Fit VBox to parent GridPane使 VBox 适合父 GridPane
【发布时间】:2015-06-23 06:17:37
【问题描述】:

我有 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 网格 带有浅蓝色边框的容器:VBox box GridPane 有红色背景,VBox 有粉红色背景。你可以看到它显然不适合它的父宽度。

提前致谢

【问题讨论】:

  • 请提供mcve,例如FXML 文件(如果您使用 FXML)或 Java 代码(如果您不是)。
  • 内容已编辑。我希望现在很清楚
  • 你想让VBox和ImageView的宽度一样吗? second column 是什么?根据提供的代码,VBox 在第二列。
  • 我不相信你不明白我的问题。恐怕我不能让它更简单...第二列是 GridPane 的列,其中嵌套了 VBox (grid.add(box,1,0); )。我希望 VBox 与此列具有相同的宽度。令人惊讶的是,我正在谈论的列的宽度约为 1000 像素,但放在其中的 VBox 有 500 像素,因为它的宽度适合它包含的 Text 对象。
  • @PawełWójcik 设置 GridPane.setHgrow(box, Priority.Always); 是否适合您?

标签: java javafx vbox gridpane


【解决方案1】:

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

由于box 是gridPane 的子对象,您可以使用静态方法setHgrow 应用属性

GridPane.setHgrow(box, Priority.Always);

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

【讨论】:

    【解决方案2】:

    了解首选尺寸

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

    来自Scene 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

    【讨论】:

    • 感谢您的关注和帮助,我觉得您的回答也很有用
    猜你喜欢
    • 2014-12-14
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2020-02-21
    相关资源
    最近更新 更多