如何使用面板

JPanel类为轻量级组件提供通用容器。默认情况下,面板不会为自己的背景添加颜色;但是,您可以轻松地为其添加边框,也可以自定义其绘画。详细信息可以在进行定制绘画中找到。

在许多类型的外观中,默认情况下面板是不透明的。如使用顶层容器中所述,不透明面板可以很好地用作内容窗格,并可以有效地进行绘画。您可以通过调用setOpaque方法来更改面板的透明度。透明面板不会绘制背景,因此下面的任何组件都可以显示出来。

An Example

下图显示了Converter应用程序的彩色版本,该版本在Using Models中进行了详细讨论。

Colorful Converter

Converter示例以多种方式使用面板:

  • 一个JPanel实例(在前面的快照中为红色)用作应用程序框架的内容窗格。此内容窗格使用从上到下的BoxLayout布置其内容,并使用空边框在其周围放置 5 个像素。有关内容窗格的信息,请参见使用顶层容器

  • 名为ConversionPanel的自定义JPanel子类的两个实例(颜色为青色)用于包含组件并协调组件之间的通信。这些ConversionPanel面板还具有标题边框,这些边框描述了它们的内容并用一行将内容括起来。每个ConversionPanel面板都使用从左到右的BoxLayout对象布置其内容。

  • 在每个ConversionPanel中,使用JPanel实例(洋红色)来确保组合框的大小和位置正确。这些JPanel实例中的每个实例都使用从上到下的BoxLayout对象(在不可见的填充空间的帮助下)对组合框进行布局。

  • 在每个ConversionPanel中,一个未命名的JPanel子类(蓝色)的实例将两个组件(文本字段和滑块)组合在一起并限制其大小。这些JPanel实例中的每一个都使用从上到下的BoxLayout对象布置其内容。

Converter应用程序通常如下所示。

Normal Converter

Converter示例所示,面板对于将组件分组,简化组件布局以及在组件组周围放置边框很有用。本节的其余部分提供有关组件分组和布局的提示。有关使用边框的信息,请参见如何使用边框

设置布局 管理 器

像其他容器一样,面板使用布局 管理 器来定位和调整其组件的大小。默认情况下,面板的布局 管理 器是FlowLayout的实例,该实例将面板的内容放置在一行中。您可以通过调用setLayout方法或在创建面板时指定布局 管理 器来轻松地使面板使用任何其他布局 管理 器。由于性能原因,后一种方法是可取的,因为它避免了不必要的FlowLayout对象的创建。

这是创建面板时如何设置布局 管理 器的示例。

JPanel p = new JPanel(new BorderLayout()); //PREFERRED!

这种方法不适用于BoxLayout,因为BoxLayout构造函数需要一个预先存在的容器。这是使用BoxLayout的示例。

JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));

Adding Components

将组件添加到面板时,可以使用add方法。您为add方法指定的确切参数取决于面板使用的布局 管理 器。当布局 管理 器是FlowLayoutBoxLayoutGridLayoutSpringLayout时,通常将使用单参数add方法,如下所示:

aFlowPanel.add(aComponent);
aFlowPanel.add(anotherComponent);

当布局 管理 器为BorderLayout时,您需要提供一个参数,以指定添加的组件在面板中的位置。例如:

aBorderPanel.add(aComponent, BorderLayout.CENTER);
aBorderPanel.add(anotherComponent, BorderLayout.PAGE_END);

使用GridBagLayout时,可以使用add方法之一,但是必须以某种方式为每个组件指定网格袋约束

有关选择和使用标准布局 管理 器的信息,请参见使用布局 管理 器

Panel API

JPanel类本身中的 API 最少。您最有可能在JPanel对象上调用的方法是从其超类JComponentContainerComponent继承的方法。下表列出了您最可能使用的 API,与borderslayout hints相关的方法除外。有关所有JComponent对象可以使用的 API 的更多信息,请参见JComponent 类

创建一个 JPanel

ConstructorPurpose
JPanel()

JPanel(LayoutManager)
创建一个面板。 LayoutManager参数为新面板提供布局 管理 器。默认情况下,面板使用FlowLayout布置其组件。

管理 容器的组件

MethodPurpose
void add(Component)

void add(Component,int)
void add(组件,对象)
无效 add(Component,Object,int)
void add(String,Component)
将指定的组件添加到面板。如果存在,则int参数是容器内组件的索引。默认情况下,添加的第一个组件位于索引 0,第二个组件位于索引 1,依此类推。 Object参数取决于布局 管理 器,通常向布局 管理 器提供有关所添加组件的位置和其他布局约束的信息。 String参数类似于Object参数。
int getComponentCount()获取此面板中的组件数。
Component getComponent(int)
组件 getComponentAt(int,int)
Component getComponentAt(Point)
Component[] getComponents()
获取指定的一个或多个组件。您可以根据其索引或* x,y *位置获取组件。
void remove(Component)
void remove(int)
void removeAll()
删除指定的组件。

设置或获取布局 管理 器

MethodPurpose
void setLayout(LayoutManager)

LayoutManager getLayout()
设置或获取此面板的布局 管理 器。布局 管理 器负责根据某些原理将面板的组件放置在面板的边界内。

使用面板的示例

本类中包含的许多示例都使用JPanel对象。下表列出了一些。

ExampleWhere DescribedNotes
ConverterThis section使用五个面板,其中四个使用BoxLayout,其中一个使用GridLayout。面板使用边框以及必要时的尺寸和对齐提示来影响布局。
ListDemo如何使用清单使用具有默认FlowLayout管理 器的面板将三个组件连续居中。
ToolBarDemo如何使用工具栏将面板用作内容窗格。该面板包含由BorderLayout布局的三个组件。
BorderDemo如何使用边框包含许多具有各种边框的面板。多个面板使用BoxLayout
BoxLayoutDemo如何使用 BoxLayout说明了与 Swing 的BoxLayout管理 器一起使用的面板。