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
不是任何 Node
的 parent
。 VBox
是 Scene
的根,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();
}
我正在学习 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
不是任何 Node
的 parent
。 VBox
是 Scene
的根,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();
}