Javafx:使用布局管理器进行测试?

Javafx : test with a layout manager?

我正在学习 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();

  }

}

在 "code 1" 中:vBox 的宽度和高度是根 ass 中包含的元素的宽度和高度吗?根组是 vbox 的父级吗?因此,vBox 不会填满整个 space 吗? 在 "code 2" 中:因为我不使用某些根组,所以 vbox 尺寸将是场景的尺寸,因为场景是 vbox 的父级? 我的理解正确吗?

如果那是正确的,我的问题是:有一个 "top label"、一个 "bottom label" 和一个可以填充所有空闲 space 的矩形的代码是什么?在代码 2 中,我从来没有看到底部标签”,因为矩形高度似乎是场景的高度,所以我想底部标签不在场景中。但是如何解决?

感谢大家帮助理解 javafx

这个

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

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

In the "code 1" : does the width and height of the vBox are those of the elements contained in the root ass the root group is the parent of the vbox ?

Group 的 children 尺寸是首选尺寸。结合上述问题,您得到的布局无法填满整个 width/height 可用空间。

In the "code 2" : as I don't use some root group, the vbox dimensions will be the ones of the scene as the scene is the parent of the vbox ?

大部分正确,除了一些不精确的公式:Scene 不是任何 NodeparentVBoxScene 的根,Scene 包含 VBox.

In the code 2, I never see the bottom label" as it seems the rectangle height is the height of the scene so, I suppose the bottom label is out of the scene.

没错。

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

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

@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();
}