# 布局管理器的可视指南

> 原文： [https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html](https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)

几个 AWT 和 Swing 类提供了一般用途的布局管理器：

*   [`BorderLayout`](#border)
*   [`BoxLayout`](#box)
*   [`CardLayout`](#card)
*   [`FlowLayout`](#flow)
*   [`GridBagLayout`](#gridbag)
*   [`GridLayout`](#grid)
*   [`GroupLayout`](#group)
*   [`SpringLayout`](#spring)

本节显示使用这些布局管理器的示例 GUI，并告诉您在何处查找每个布局管理器的操作方法页面。您可以在操作方法页面和[示例索引](../examples/layout/index.html)中找到用于运行示例的链接。

* * *

**Note:** This lesson covers writing layout code by hand, which can be challenging. If you are not interested in learning all the details of layout management, you might prefer to use the `GroupLayout` layout manager combined with a builder tool to lay out your GUI. One such builder tool is the [NetBeans IDE](../learn/index.html). Otherwise, if you want to code by hand and do not want to use `GroupLayout`, then `GridBagLayout` is recommended as the next most flexible and powerful layout manager.

* * *

如果您对使用 JavaFX 创建 GUI 感兴趣，请参阅[在 JavaFX](https://docs.oracle.com/javase/8/javafx/layout-tutorial/index.html) 中使用布局。

## BorderLayout 的

<center>![A picture of a GUI that uses BorderLayout](img/ad6ae2877c21489c23de688be50fa24d.jpg)</center>

每个内容窗格都初始化为使用`BorderLayout`。 （正如[使用顶级容器](../components/toplevel.html)所解释的那样，内容窗格是所有框架，小程序和对话框中的主要容器。）`BorderLayout`将组件放置在最多五个区域：顶部，底部，左侧，对，中心。所有额外空间均位于中心区域。如果您希望能够将杆拖离其起始位置，则必须在`BorderLayout`容器内创建使用 [JToolBar](../components/toolbar.html) 创建的工具栏。有关详细信息，请参阅[如何使用 BorderLayout](border.html) 。

<center>![A picture of a GUI that uses BoxLayout](img/8e510cc5e929290b39de89731eb49bb4.jpg)</center>

`BoxLayout`类将组件放在单个行或列中。它尊重组件所要求的最大尺寸，并允许您对齐组件。有关详细信息，请参阅[如何使用 BoxLayout](box.html) 。

![A picture of a GUI that uses CardLayout](img/26aec8afefd1f2f5326323d57942ca0a.jpg) ![Another picture of the same layout](img/3b53a2bceda4ff23a72ba9b204c40c0b.jpg)

`CardLayout`类允许您在不同时间实现包含不同组件的区域。 `CardLayout`通常由组合框控制，组合框的状态决定`CardLayout`显示哪个面板（组件组）。使用`CardLayout`的另一种方法是使用[选项卡式窗格](../components/tabbedpane.html)，它提供类似的功能，但具有预定义的 GUI。有关详细信息，请参阅[如何使用 CardLayout](card.html) 。

<center>![A picture of a GUI that uses FlowLayout](img/acf1d6cee94083b9de2ccbb3be6c197a.jpg)</center>

`FlowLayout`是每个`JPanel`的默认布局管理器。它只是将组件放在一行中，如果它的容器不够宽，则开始一个新行。 CardLayoutDemo 中的两个面板（以前显示为 [](#card) ）都使用`FlowLayout`。有关详细信息，请参阅[如何使用 FlowLayout](flow.html) 。

<center>![A picture of a GUI that uses GridBagLayout](img/6ede3d7f6d186f09fd9b0e05029fe3b9.jpg)</center>

`GridBagLayout`是一个复杂，灵活的布局管理器。它通过将组件放置在单元格网格中来对齐组件，从而允许组件跨越多个单元格。网格中的行可以具有不同的高度，并且网格列可以具有不同的宽度。有关详细信息，请参阅[如何使用 GridBagLayout](gridbag.html) 。

<center>![A picture of a GUI that uses GridLayout](img/014b93e45655af3e7a1f69b4c75c538e.jpg)</center>

`GridLayout`只是使一组组件大小相等，并以请求的行数和列数显示它们。有关详细信息，请参阅[如何使用 GridLayout](grid.html) 。

<center>![A picture of a GUI that uses GroupLayout](img/00f007d7ae784f49a507eb570bb0bc37.jpg)</center>

`GroupLayout`是为 GUI 构建器工具开发的布局管理器，但也可以手动使用。 `GroupLayout`分别与水平和垂直布局配合使用。为每个维度单独定义布局。因此，每个组件需要在布局中定义两次。上面显示的查找窗口是`GroupLayout`的示例。有关详细信息，请参阅[如何使用 GroupLayout](group.html) 。

<center>![A picture of a GUI that uses SpringLayout](img/7d7a0a5f20c81a5a6f26182b0fe72d3a.jpg)</center>

<center>![Another GUI that uses SpringLayout](img/247dbdc9e832944c9b43729ece90d0f4.jpg)</center>

`SpringLayout`是一个灵活的布局管理器，专为 GUI 构建器使用而设计。它允许您指定其控制下的组件边缘之间的精确关系。例如，您可以定义一个组件的左边缘是从第二个组件的右边缘开始的某个距离（可以动态计算）。 `SpringLayout`根据一组约束条件列出其相关容器的子项，如[如何使用 SpringLayout](spring.html) 中所示。