如何使用面板

原文: https://docs.oracle.com/javase/tutorial/uiswing/components/panel.html

JPanel 类为轻量级组件提供通用容器。默认情况下,除了自己的背景外,面板不会添加任何颜色;但是,您可以轻松地为它们添加边框,也可以自定义它们的绘画。详细信息请参见执行自定义绘画

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

下图显示了Converter应用程序的彩色版本,在使用模型中有更详细的讨论。

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对象的创建。

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

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

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

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

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

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

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

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

使用GridBagLayout,您可以使用add方法,但必须以某种方式为每个组件指定网格包约束

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

JPanel类本身的 API 很小。您最有可能在JPanel对象上调用的方法是它从超类继承的方法 - JComponentContainerComponent 。下表列出了您最有可能使用的 API,但与 border布局提示相关的方法除外。有关所有JComponent对象可以使用的 API 的更多信息,请参阅 JComponent 类

目的
JPanel()

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

方法 目的
void add(组分)

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

方法 目的
void setLayout(LayoutManager)

LayoutManager getLayout() | 设置或获取此面板的布局管理器。布局管理器负责根据一些原理将面板的组件定位在面板的范围内。 |

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

在哪里描述 笔记
Converter 这个部分 使用五个面板,其中四个使用BoxLayout,其中一个使用GridLayout。面板使用边框,并根据需要使用大小和对齐提示来影响布局。
ListDemo 如何使用列表 使用具有默认FlowLayout管理器的面板将一个组件连续居中。
ToolBarDemo 如何使用工具栏 使用面板作为内容窗格。该面板包含三个组件,由BorderLayout列出。
BorderDemo 如何使用边框 包含许多具有各种边框的面板。几个面板使用BoxLayout
BoxLayoutDemo 如何使用 BoxLayout 说明使用 Swing 的BoxLayout管理器的面板。