我正在学习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
答案 0 :(得分:1)
此
rect.heightProperty().bind(vBox.heightProperty());
是你不应该做的事情。它根据其父级的大小调整Rectangle
的大小。然而,父母的高度取决于其子女的大小。这种循环依赖导致VBox
的行为不再被明确定义......
在“代码1”中:vBox的宽度和高度是根包含的元素,根组是vbox的父节点吗?
Group
的孩子的大小是首选的大小。结合上述问题,您将得到一个不能填充整个宽度/高度的布局。
在“代码2”中:由于我没有使用某个根组,因为场景是vbox的父级,vbox维度将是场景的维度?
大致正确,除了一些不精确的表述:Scene
不是任何parent
的{{1}}。 Node
是VBox
的根,Scene
包含Scene
。
在代码2中,我从未看到底部标签“因为看起来矩形高度是场景的高度所以,我认为底部标签不在场景中。
这是正确的。
VBox
不是可调整大小的,因此它与Rectangle
父级无法很好地实现所需的行为。但是,你可以使用'Region',它可以调整大小。填充可以使用VBox
的背景来完成,如果需要,笔划可以用边框替换。
将Region
设置为vgrow
告诉Priority.ALWAYS
始终调整VBox
而不是其他孩子的尺寸,并将Region
设置为fillWidth
告诉true
将孩子的大小更改为自己的宽度:
VBox