当前位置: 首页 > 知识库问答 >
问题:

爪哇:用布局管理器测试?

西门庆
2023-03-14

我正在学习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个答案

邓崇凛
2023-03-14

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

是你不应该做的事。它根据其父级的大小调整矩形的大小。然而,父对象的高度取决于其子对象的大小。这种循环依赖导致VBox的行为不再得到很好的定义。。。

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

的子级的大小是首选大小。结合上述问题,您得到的布局无法填充可用的整个宽度/高度。

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

除了一些不精确的公式外,大部分都是正确的:场景不是任何Node>的 VBox是 场景的根, VBox包含 VBox

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

这是正确的。

矩形不是可调整大小的,因此它不能很好地与 VBox 父级配合使用以实现所需的行为。但是,您可以改用“区域”,这是可调整大小的。可以使用区域的背景进行填充,如果需要,笔划可以替换为边框。

vgrow 设置为“优先级”始终告诉 VBox 始终调整区域的大小而不是其他子,并将 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();
}
 类似资料:
  • 我试图使用创建一个厨房显示系统,并试图找出一种方法,当第一行已经满了时,在第二行添加另一个面板。GUI的宽度将根据用户的喜好而改变。当更宽时,它应该每行显示更多的组件。

  • *label1:combo1 label2:combo2 label3:combo3 label4:text1 label5:text2 label6:text3*

  • 我需要在中制作这样的表。 有什么想法如何做到这一点,以获得像下面图片上的布局吗?

  • 在一个GUI程序里,布局是一个很重要的方面。布局就是如何管理应用中的元素和窗口。有两种方式可以搞定:绝对定位和PyQt5的layout类 绝对定位 每个程序都是以像素为单位区分元素的位置,衡量元素的大小。所以我们完全可以使用绝对定位搞定每个元素和窗口的位置。但是这也有局限性: 元素不会随着我们更改窗口的位置和大小而变化。 不能适用于不同的平台和不同分辨率的显示器 更改应用字体大小会破坏布局 如果我

  • 在一个 GUI 程序里,布局是一个很重要的方面。布局就是如何管理应用中的元素和窗口。有两种方式可以搞定:绝对定位和 PyQt5 的 layout 类 绝对定位 每个程序都是以像素为单位区分元素的位置,衡量元素的大小。所以我们完全可以使用绝对定位搞定每个元素和窗口的位置。但是这也有局限性: 元素不会随着我们更改窗口的位置和大小而变化。 不能适用于不同的平台和不同分辨率的显示器 更改应用字体大小会破坏

  • 目前我正在开发一个应用程序,允许用户创建一个模板并将其生成为DOCX文件。应用程序需要能够在用户创建模板时向用户显示模板中的更改。 我尝试的方法是使用DOCX4J库(允许操作DOCX文件)和ICEPDF,后者主要用于通过将DOCX首先转换为PDF文件来将其显示到swing组件中。现在,这种方法的问题是加载速度非常慢,DOCX文件中发生的一些更改没有反映在PDF转换中(例如:虚线下划线、字体更改)。