# 如何使用 BorderLayout

> 原文： [https://docs.oracle.com/javase/tutorial/uiswing/layout/border.html](https://docs.oracle.com/javase/tutorial/uiswing/layout/border.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`](https://docs.oracle.com/javase/8/docs/api/java/awt/BorderLayout.html) 类的应用程序的快照。

<center>![A snapshot of BorderLayoutDemo](img/ad6ae2877c21489c23de688be50fa24d.jpg)</center>

单击“启动”按钮以使用 [Java™Web Start](http://www.oracle.com/technetwork/java/javase/javawebstart/index.html) （[下载 JDK 7 或更高版本](http://www.oracle.com/technetwork/java/javase/downloads/index.html)）运行 BorderLayoutDemo。或者，要自己编译并运行示例，请参考[示例索引](../examples/layout/index.html#BorderLayoutDemo)。

[![Launches the BorderLayoutDemo application](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/BorderLayoutDemoProject/BorderLayoutDemo.jnlp)

该演示的完整代码位于 [`BorderLayoutDemo.java`](../examples/layout/BorderLayoutDemoProject/src/layout/BorderLayoutDemo.java) 文件中。

如上图所示，`BorderLayout`对象有五个区域。这些区域由`BorderLayout`常量指定：

*   `PAGE_START`
*   `PAGE_END`
*   `LINE_START`
*   `LINE_END`
*   `CENTER`

* * *

**Version note:** 

在 JDK 1.4 版之前，各个区域的首选名称是不同的，从罗盘的点（例如，顶部区域的`BorderLayout.NORTH`）到我们在示例中使用的常量的更多版本。我们的示例使用的常量是首选，因为它们是标准的，并使程序能够适应具有不同方向的语言。

* * *

如果窗口被放大，则中心区域将获得尽可能多的可用空间。其他区域的扩展仅为填补所有可用空间所需的数量。容器通常只使用`BorderLayout`对象的一个​​或两个区域 - 只是中心，或中心和底部。

以下代码将组件添加到框架的内容窗格中。由于内容窗格默认使用`BorderLayout`类，因此代码不需要设置布局管理器。完整的程序位于 [`BorderLayoutDemo.java`](../examples/layout/BorderLayoutDemoProject/src/layout/BorderLayoutDemo.java) 文件中。

```
...//Container pane = aFrame.getContentPane()...
JButton button = new JButton("Button 1 (PAGE_START)");
pane.add(button, BorderLayout.PAGE_START);

//Make the center component big, since that's the
//typical usage of BorderLayout.
button = new JButton("Button 2 (CENTER)");
button.setPreferredSize(new Dimension(200, 100));
pane.add(button, BorderLayout.CENTER);

button = new JButton("Button 3 (LINE_START)");
pane.add(button, BorderLayout.LINE_START);

button = new JButton("Long-Named Button 4 (PAGE_END)");
pane.add(button, BorderLayout.PAGE_END);

button = new JButton("5 (LINE_END)");
pane.add(button, BorderLayout.LINE_END);

```

将组件的位置（例如，`BorderLayout.LINE_END`）指定为`add`方法的参数之一。如果从`BorderLayout`对象控制的容器中缺少此组件，请确保指定了组件的位置，并且没有其他组件放在同一位置。

所有使用`BorderLayout`类的教程示例都将组件指定为`add`方法的第一个参数。例如：

```
add(component, BorderLayout.CENTER)  //preferred

```

但是，其他程序中的代码将组件指定为第二个参数。例如，以下是编写前面代码的其他方法：

```
add(BorderLayout.CENTER, component)  //valid but old fashioned
    or
add("Center", component)             //valid but error prone

```

下表列出了指定间隙（以像素为单位）的构造函数和方法。

<caption>Specifying gaps</caption>
| 构造函数或方法 | 目的 |
| --- | --- |
| [`BorderLayout（int _horizo​​ntalGap_ ，int _verticalGap_ ）`](https://docs.oracle.com/javase/8/docs/api/java/awt/BorderLayout.html#BorderLayout-int-int-) | 定义组件之间具有指定间隙的边框布局。 |
| [`setHgap(int)`](https://docs.oracle.com/javase/8/docs/api/java/awt/BorderLayout.html#setHgap-int-) | 设置组件之间的水平间隙。 |
| [`setVgap(int)`](https://docs.oracle.com/javase/8/docs/api/java/awt/BorderLayout.html#setVgap-int-) | 设置组件之间的垂直间隙。 |

下表列出了使用`BorderLayout`类并提供相关部分链接的代码示例。

| 例 | 在哪里描述 | 笔记 |
| :-- | :-- | :-- |
| [`BorderLayoutDemo`](../examples/layout/index.html#BorderLayoutDemo) | 这一页 | 在五个可能的位置中的每一个中放置一个组件。 |
| [`TabbedPaneDemo`](../examples/components/index.html#TabbedPaneDemo) | [如何使用选项卡式窗格](../components/tabbedpane.html) | 将单个组件放在内容窗格中心的许多示例之一，以便组件尽可能大。 |
| [`CheckBoxDemo`](../examples/components/index.html#CheckBoxDemo) | [如何使用复选框](../components/button.html#checkbox) | 创建使用`BorderLayout`类的`JPanel`对象。将组件放入左侧（实际上是`LINE_START`）和中心位置。 |