Javafx:用布局管理器测试?

时间:2016-08-08 10:06:22

标签: layout javafx layout-manager shape

我正在学习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的宽度和高度是根包含的元素,根组是vbox的父节点吗?因此,vBox不会填满整个空间? 在"代码2" :由于我不使用某个根组,因为场景是vbox的父级,vbox维度将是场景的维度? 我的理解是否正确?

如果这是正确的,我的问题是:如果有一个"顶部标签",一个"底部标签"和一个可以填满所有自由空间的矩形?在代码2中,我从未看到底部标签"因为看起来矩形高度是场景的高度所以,我认为底部标签不在场景中。但是如何解决呢?

感谢大家帮助理解javafx

1 个答案:

答案 0 :(得分:1)

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

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

  

在“代码1”中:vBox的宽度和高度是根包含的元素,根组是vbox的父节点吗?

Group的孩子的大小是首选的大小。结合上述问题,您将得到一个不能填充整个宽度/高度的布局。

  

在“代码2”中:由于我没有使用某个根组,因为场景是vbox的父级,vbox维度将是场景的维度?

大致正确,除了一些不精确的表述:Scene不是任何parent的{​​{1}}。 NodeVBox的根,Scene包含Scene

  

在代码2中,我从未看到底部标签“因为看起来矩形高度是场景的高度所以,我认为底部标签不在场景中。

这是正确的。

VBox不是可调整大小的,因此它与Rectangle父级无法很好地实现所需的行为。但是,你可以使用'Region',它可以调整大小。填充可以使用VBox的背景来完成,如果需要,笔划可以用边框替换。

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

VBox