如果您想为此使用 a VBox
,您正在寻找的方法是:
VBox.setVgrow(node, Priority.ALWAYS);
默认情况下,VBox 只会在放置位置的左上角将子项放在另一个下方。子项不会扩展以填充所有可用的垂直区域,除非您对具有无限制最大高度的子项设置 Vgrow 约束。
您可以通过几种不同的方式获得所需的布局(还有其他方式):
- 使用 a
StackPane
而不是 aVBox
并将您的按钮与StackPane.setAlignment(closeButton, Pos.BOTTOM_CENTER);
- 使用 a
AnchorPane
而不是 aVBox
并适当地设置约束AnchorPane
。
- 使用一个弹簧区域,它是一个空区域,可扩展以填充空白空间。
样品弹簧区域:
Region topSpring = new Region();
Region bottomSpring = new Region();
Scene aboutDialogScene = new Scene(VBoxBuilder.create()
.children(topSpring, new Text(text), bottomSpring, closeButton)
.alignment(Pos.CENTER)
.padding(new Insets(10))
.build(), xSize, ySize, backgroundColor);
VBox.setVgrow(topSpring, Priority.ALWAYS);
VBox.setVgrow(bottomSpring, Priority.ALWAYS);
调用closeButton.setAlignment(Pos.BOTTOM_CENTER);
设置 closeButton 中事物(文本和图形)的对齐方式,而不是 closeButton 在其父级中的对齐方式(这是您真正想要的)。
为了理解布局约束是如何工作的,ScenicBuilder是一个很好的工具,ScenicView可以帮助调试现有代码中的布局问题。
以下是您的布局的一些 FXML 示例,您可以将它们加载到 SceneBuilder 以查看不同布局选项的工作方式。
如果您愿意,可以使用 JavaFX API 在纯 Java 中轻松编写以下所有示例。我用 fxml 编写它们,因为它使布局易于在 SceneBuilder 中预览。
使用 StackPane 的 FXML 示例:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<StackPane id="StackPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
<children>
<Label text="SQL Browser Version 1.0" />
<Button mnemonicParsing="false" text="Button" StackPane.alignment="BOTTOM_CENTER" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</StackPane>
一些春季地区也是如此:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<VBox alignment="CENTER" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
<children>
<Region prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" />
<Label text="SQL Browser Version 1.0" />
<Region prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" />
<Button mnemonicParsing="false" text="Close" />
</children>
</VBox>
与标签本身设置为扩展以填充 VBox 中的空白空间相同的事情:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<VBox alignment="CENTER" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
<children>
<Label maxHeight="1.7976931348623157E308" text="SQL Browser Version 1.0" VBox.vgrow="ALWAYS" />
<Button mnemonicParsing="false" text="Close" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</VBox>