当前教程
JavaFX 布局控件
系列中的下一篇

系列中的上一篇: JavaFX 应用程序基本结构示例

系列中的下一篇: 效果、渐变和动画

JavaFX 布局控件

此页面由 Gail C. AndersonPaul Anderson 贡献,根据 UPL 许可,摘自 Apress 慷慨提供的 使用 JavaFX 17 的现代 Java 客户端的权威指南

 

简介

为了管理场景中的节点,您可以使用一个或多个这些控件。每个控件都针对特定的布局配置而设计。此外,您可以嵌套布局控件来管理节点组并指定布局如何对事件(例如调整大小或对管理节点的更改)做出反应。您可以指定对齐设置以及边距控件和填充。

有多种方法可以将节点添加到布局容器中。您可以使用布局容器的构造函数添加子节点。您还可以使用方法 getChildren().add() 添加单个节点,并使用方法 getChildren().addAll() 添加多个节点。此外,一些布局控件具有用于添加节点的专用方法。现在让我们看一下几个常用的布局控件,向您展示 JavaFX 如何为您组合场景。  

StackPane

一个方便且易于使用的布局容器是 StackPane。此布局控件按您添加节点的顺序从后到前堆叠其子节点。请注意,我们首先添加椭圆形,以便它显示在文本节点的后面。如果顺序相反,椭圆形将遮挡文本元素。

默认情况下,StackPane 将其所有子节点居中。您可以为子节点提供不同的对齐方式,或在 StackPane 中对特定节点应用对齐方式。例如,

// align the text only
stackPane.setAlignment(text, Pos.BOTTOM_CENTER);

将文本节点居中在 StackPane 的底部边缘。现在,当您调整窗口大小时,椭圆形将保持居中,而文本将保持固定在窗口的底部边缘。要将所有管理节点的对齐方式指定为底部边缘,请使用

// align all managed nodes
stackPane.setAlignment(Pos.BOTTOM_CENTER);

虽然椭圆形和文本都出现在窗口的底部,但它们不会彼此相对居中。为什么呢?  

AnchorPane

AnchorPane 根据配置的锚点管理其子节点,即使容器调整大小也是如此。您为组件指定了距窗格边缘的偏移量。在这里,我们将一个 Label 添加到 AnchorPane 并将其锚定到窗格的左下角,偏移量为 10 像素

AnchorPane anchorPane = new AnchorPane();
Label label = new Label("My Label");
anchorPane.getChildren().add(label);
AnchorPane.setLeftAnchor(label, 10.0);
AnchorPane.setBottomAnchor(label, 10.0);

AnchorPane 通常用作顶级布局管理器来控制边距,即使窗口调整大小也是如此。  

GridPane

GridPane 允许您将子节点放置在灵活大小的二维网格中。组件可以跨越行和/或列,但行大小对于给定行中的所有组件都是一致的。类似地,列的宽度对于给定列是相同的。 GridPane 具有将节点添加到由列和行号指定的特定单元格的专用方法。可选参数允许您指定列和行跨度值。例如,这里第一个标签被放置在对应于列 0 和行 0 的单元格中。第二个标签进入对应于列 1 和行 0 的单元格,并且它跨越两列(第二列和第三列)。我们还必须提供一个行跨度值(这里设置为 1)

GridPane gridPane = new GridPane();
gridPane.add(new Label("Label1"), 0, 0);
gridPane.add(new Label("Label2 is very long"), 1, 0, 2, 1);

GridPane 对于在适应不同大小的列或行的表单中布局组件非常有用。 GridPane 还允许节点跨越多个列或行。我们在主-细节 UI 示例中使用 GridPane(参见本系列的“将所有内容整合在一起”部分)。  

FlowPane 和 TilePane

FlowPane 以水平或垂直流的方式管理其子节点。默认方向为水平。您可以使用构造函数指定流方向,也可以使用方法 setOrientation()。在这里,我们使用构造函数指定垂直方向

FlowPane flowpane = new FlowPane(Orientation.VERTICAL);

FlowPane 根据可配置的边界包装子节点。如果调整包含 FlowPane 的窗格的大小,布局将根据需要调整流。单元格的大小取决于节点的大小,除非所有节点的大小都相同,否则它不会是统一的网格。此布局对于大小可能不同的节点(例如 ImageView 节点或形状)很方便。TilePaneFlowPane 类似,不同之处在于 TilePane 使用大小相等的单元格。  

BorderPane

BorderPane 对于具有独立部分的桌面应用程序很方便,包括顶部工具栏(顶部)、底部状态栏(底部)、中心工作区(中心)和两个侧边区域(右侧和左侧)。五个部分中的任何一个都可以为空。这是一个带有中心矩形和顶部标签的 BorderPane 的示例

BorderPane borderPane = new BorderPane();
Label colorLabel = new Label("Color: Lightblue");
colorLabel.setFont(new Font("Verdana", 18));
borderPane.setTop(colorLabel);
Rectangle rectangle = new Rectangle(100, 50, Color.LIGHTBLUE);
borderPane.setCenter(rectangle);
BorderPane.setAlignment(colorLabel, Pos.CENTER);
BorderPane.setMargin(colorLabel, new Insets(20,10,5,10));

请注意,BorderPane 默认情况下对中心区域使用中心对齐,对顶部使用左对齐。为了使顶部区域标签居中,我们使用 Pos.CENTER 配置其对齐方式。我们还使用 BorderPane 静态方法 setMargin() 设置标签周围的边距。Insets 构造函数接受四个值,分别对应于顶部、右侧、底部和左侧边缘。类似的对齐方式和边距配置也适用于其他布局组件。  

SplitPane

SplitPane 将布局空间划分为多个水平或垂直配置的区域。分隔线是可移动的,您通常在 SplitPane 的每个区域中使用其他布局控件。我们在主-细节 UI 示例中使用 SplitPane(查看这些系列的“将所有内容整合在一起”部分)。  

HBox、VBox 和 ButtonBar

HBoxVBox 布局控件为子节点提供单个水平或垂直放置。您可以将 HBox 节点嵌套在 VBox 中以实现网格效果,或者将 VBox 节点嵌套在 HBox 组件中。 ButtonBar 对于在水平容器中放置一行大小相等的按钮很方便。  

创建场景

回到 MyShapes,场景包含由其根节点定义的场景图。

package org.modernclient;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Ellipse;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class MyShapes extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        // Create an Ellipse and set fill color
        Ellipse ellipse = new Ellipse(110, 70);
        ellipse.setFill(Color.LIGHTBLUE);
        // Create a Text shape with font and size
        Text text = new Text("My Shapes");
        text.setFont(new Font("Arial Bold", 24));
        StackPane stackPane = new StackPane();
        stackPane.getChildren().addAll(ellipse, text);
        Scene scene = new Scene(stackPane, 350, 230,
                       Color.LIGHTYELLOW);
        stage.setTitle("MyShapes with JavaFX");
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

首先,我们构造 Scene 并提供 stackPane 作为根节点。然后,我们以像素为单位指定其宽度和高度,并为背景提供可选的填充参数(Color.LIGHTYELLOW)。剩下的就是配置 Stage。我们提供一个标题,设置场景,并显示舞台。JavaFX 运行时将渲染我们的场景。以下是 MyShapes 应用程序的场景图的层次结构视图。根节点是 StackPane,它包含其两个子节点 EllipseText

MyShapes scene graph


上次更新: 2023 年 9 月 12 日


当前教程
JavaFX 布局控件
系列中的下一篇

系列中的上一篇: JavaFX 应用程序基本结构示例

系列中的下一篇: 效果、渐变和动画