【问题标题】:Javafx : test with a layout manager?Javafx:使用布局管理器进行测试?
【发布时间】:2016-08-08 10:06:22
【问题描述】:

我正在学习 javafx,我很少尝试使用 vbox 布局管理器。代码似乎没问题,但我想检查一下我是否真的理解它是如何工作的。

代码如下:

public class TestShape2 extends Application {

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

  @Override
  public void start(Stage primaryStage) throws Exception {
      Group root = new Group();
      Label topLabel = new Label("Top...");
      Label topLabel2 = new Label("Top 2...");
      Rectangle rect = new Rectangle();

      rect.setFill(Color.AQUA);
      Label bottomLabel = new Label("Bottom...");

      VBox vBox = new VBox();
      rect.widthProperty().bind(vBox.widthProperty());
      rect.heightProperty().bind(vBox.heightProperty());

      vBox.getChildren().addAll(topLabel, topLabel2, rect, bottomLabel);
      /*
       * Code 1
       */
      root.getChildren().add(vBox);
      Scene scene = new Scene(root, 300, 300, Color.BLANCHEDALMOND);

      /*
       * Code 2
       */
      // Scene scene = new Scene (vBox, 300, 300, Color.BLANCHEDALMOND);

      primaryStage.setScene(scene);
      primaryStage.show();

  }

}

在“代码 1”中:vBox 的宽度和高度是根 ass 中包含的元素的宽度和高度吗?根组是 vbox 的父级吗?所以,vBox 没有填满整个空间? 在“代码 2”中:因为我不使用某些根组,所以 vbox 尺寸将是场景的尺寸,因为场景是 vbox 的父级? 我的理解正确吗?

如果这是正确的,我的问题是:具有“顶部标签”、“底部标签”和填充所有可用空间的矩形的代码是什么?在代码2中,我从来没有看到底部标签”,因为矩形高度似乎是场景的高度,所以我想底部标签不在场景中。但是如何解决呢?

感谢大家帮助理解javafx

【问题讨论】:

    标签: layout javafx layout-manager shape


    【解决方案1】:

    这个

    rect.heightProperty().bind(vBox.heightProperty());
    

    是你不应该做的事情。它根据其父级的大小调整Rectangle 的大小。然而,父级的高度取决于其子级的大小。这种循环依赖导致VBox 的行为不再被明确定义...

    在“代码1”中:vBox的宽度和高度是否是根ass中包含的元素的宽度和高度?根组是vbox的父级?

    Group 的孩子的大小是首选大小。结合上面描述的问题,您会得到一个没有填满整个可用宽度/高度的布局。

    在“代码 2”中:由于我不使用某些根组,因此 vbox 尺寸将是场景的尺寸,因为场景是 vbox 的父级?

    除了一些不精确的表述之外大部分是正确的:Scene 不是任何NodeparentVBoxScene 的根,Scene 包含 VBox

    在代码 2 中,我从来没有看到底部标签”,因为矩形高度似乎是场景的高度,所以我想底部标签不在场景中。

    没错。

    Rectangle 不是可调整大小的,因此它不能与 VBox 父级一起很好地实现所需的行为。但是,您可以改用“区域”,它是可调整大小的。可以使用Region 的背景进行填充,如果需要,可以用边框代替笔触。

    vgrow 设置为Priority.ALWAYS 告诉VBox 始终调整Region 而不是其他孩子的大小,并将fillWidth 设置为true 告诉VBox 将孩子的大小更改为自己的宽度:

    @Override
    public void start(Stage primaryStage) throws Exception {
        Label topLabel = new Label("Top...");
        Label topLabel2 = new Label("Top 2...");
    
        Region rect = new Region();
        rect.setBackground(new Background(new BackgroundFill(Color.AQUA, CornerRadii.EMPTY, Insets.EMPTY)));
    
        Label bottomLabel = new Label("Bottom...");
    
        VBox vBox = new VBox();
        vBox.setFillWidth(true);
    
        VBox.setVgrow(rect, Priority.ALWAYS);
    
        vBox.getChildren().addAll(topLabel, topLabel2, rect, bottomLabel);
    
        Scene scene = new Scene (vBox, 300, 300, Color.BLANCHEDALMOND);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2010-09-12
      • 2018-06-12
      • 2016-03-22
      相关资源
      最近更新 更多