使用Swing组件

译自https://docs.oracle.com/javase/tutorial/uiswing/components/index.html

课程介绍

Using Top-Level Containers

本章讲解了如何使用 JFrameJDialogJApplet 类共享的功能——内容窗格、菜单栏和根窗格。还讨论了容器层次结构,即顶层容器所包含的组件树。

The JComponent Class

本节介绍了 JComponent 提供给其子类的功能——几乎所有 Swing 组件都继承自 JComponent,并提供了一些如何利用这些功能的建议。本节最后列出了 API 表,描述了 JComponent 及其父类 ContainerComponent 定义的常用 API。

Using Text Components

本节描述了所有继承自 JTextComponent 的组件共享的功能和 API。如果你只是使用文本字段(无论是否格式化)或文本区域,可能不需要阅读本节。

How to...

本节按字母顺序介绍了如何使用每个 Swing 组件。我们不建议你按顺序阅读这些内容。相反,我们建议你在准备开始在自己的程序中使用 Swing 组件时,阅读相关的“如何做”部分。例如,如果你的程序需要一个框架、标签、按钮和颜色选择器,你应该阅读《如何创建框架》、《如何使用标签》、《如何使用按钮》和《如何使用颜色选择器》。

Using HTML in Swing Components

本节介绍了如何通过使用 HTML 标签来改变 Swing 组件显示文本的字体、颜色或其他格式设置。

Using Models

本节介绍了 Swing 的模型架构。这种基于模型-视图-控制器(MVC)的变体使你可以指定如何存储和检索 Swing 组件的数据和状态。其好处在于可以在组件之间共享数据和状态,并显著提高如表格等组件在显示大量数据时的性能。

Using Borders

边框非常实用,可以用来绘制线条、标题以及在组件边缘留出空白空间。(你可能注意到,本教程中的示例使用了很多边框。)本节将告诉你如何为任何 JComponent 添加边框。

Using Icons

许多 Swing 组件可以显示图标。通常,图标是通过 ImageIcon 类的实例来实现的。

Solving Common Component Problems

本节讨论了常见组件相关问题的解决方案。

Using Top-Level Containers

如前所述,Swing 提供了三个通常有用的顶层容器类(top-level container classes):JFrameJDialogJApplet。在使用这些类时,你应该牢记以下几点:

  • 为了在屏幕上显示,每个 GUI 组件(component )必须是一个容器层次结构的一部分(containment hierarchy)。容器层次结构是一个以顶层容器(a top-level container)为根的组件树(a tree of components)。稍后我们会展示一个例子。
  • 每个 GUI 组件只能被包含一次(can be contained only once)。如果一个组件已经在一个容器中,尝试将其添加到另一个容器时,该组件会从第一个容器中移除,然后添加到第二个容器中。
  • 每个顶层容器都有一个内容窗格(a content pane),通常来说,这个内容窗格直接或间接地包含该顶层容器 GUI 中的可视组件(the visible components)。
  • 你可以选择为顶层容器添加一个菜单栏。菜单栏通常放置在顶层容器内,但位于内容窗格之外。一些外观和感觉(如 Mac OS 外观)允许将菜单栏放置在更适合该外观的位置,比如屏幕顶部。

这是一张由应用程序创建的框架(frame)图片。框架(The frame)包含一个绿色的菜单栏(没有菜单),并且在框架的内容窗格中,有一个大的空白黄色标签。

你可以在 TopLevelDemo.java 中找到这个示例的完整源码。尽管示例使用了 JFrame 来创建独立应用程序,但相同的概念也适用于 JAppletJDialog

以下是该示例 GUI 的容器层次结构:

如省略号所示,我们在这个图表中省略了一些细节。稍后我们会揭示这些缺失的细节。本节讨论的主题包括:

  • 顶层容器和容器层次结构
  • 向内容窗格添加组件
  • 添加菜单栏
  • 根窗格(即缺失的细节)

Top-Level Containers and Containment Hierarchies

每个使用 Swing 组件的程序至少有一个(at least one)顶层容器。这个顶层容器是一个容器层次结构的根——该层次结构包含了所有出现在顶层容器中的 Swing 组件。

通常情况下,使用 Swing GUI 的独立应用程序至少有一个以 JFrame 为根的容器层次结构。例如,如果一个应用程序有一个主窗口和两个对话框,那么该应用程序将有三个容器层次结构,也就是三个顶层容器。一个容器层次结构以 JFrame 为根,另外两个则分别以 JDialog 为根。

基于 Swing 的小程序至少有一个容器层次结构,其中一个层次结构以 JApplet 为根。例如,一个弹出对话框的小程序有两个容器层次结构。浏览器窗口中的组件位于一个由 JApplet 对象作为根的容器层次结构中,而对话框中的组件则位于一个由 JDialog 对象作为根的容器层次结构中。

Adding Components to the Content Pane

以下是前面示例中用于获取框架内容窗格(get a frame's content pane)并将黄色标签添加到其中的代码:

frame.getContentPane().add(yellowLabel, BorderLayout.CENTER);

如代码所示,可以通过调用 getContentPane 方法获取顶层容器的内容窗格。默认的内容窗格是一个继承自 JComponent 的简单中间容器,使用 BorderLayout 作为其布局管理器。

自定义内容窗格非常简单,例如可以更改布局管理器或添加边框。但需要注意一个小问题:getContentPane 方法返回的是一个 Container 对象,而不是 JComponent 对象。这意味着,如果想使用内容窗格的 JComponent 功能,需要将返回值进行类型转换,或者创建自己的组件作为内容窗格。我们的示例通常采用第二种方法,因为这种方式更清晰。另一个常见的方法是直接将自定义组件添加到内容窗格,完全覆盖默认的内容窗格。

需要注意的是,JPanel 的默认布局管理器是 FlowLayout,可能需要更改它。

如果要将一个组件设置为内容窗格,可以使用顶层容器的 setContentPane 方法。例如:

// 创建一个面板并向其中添加组件
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setBorder(someBorder);
contentPane.add(someComponent, BorderLayout.CENTER);
contentPane.add(anotherComponent, BorderLayout.PAGE_END);

// 将其设置为内容窗格
topLevelContainer.setContentPane(contentPane);

注意:

为方便起见,add 方法及其变体 removesetLayout 方法已被重写,以根据需要将操作转发到内容窗格(contentPane)。这意味着你可以直接写:

frame.add(child);

这样 child 会被添加到内容窗格(contentPane)中。

需要注意的是,只有这三个方法会进行这样的转发。因此,调用 getLayout() 时不会返回通过 setLayout() 设置的布局管理器。

Adding a Menu Bar

理论上,所有顶层容器都可以包含一个菜单栏。但实际上,菜单栏通常只出现在 JFrameJApplet 中。要为顶层容器添加菜单栏,需要创建一个 JMenuBar 对象,将菜单添加到其中,然后调用 setJMenuBar 方法。

TopLevelDemo 示例中,以下代码将菜单栏添加到了窗口中:

frame.setJMenuBar(greenMenuBar);

有关实现菜单和菜单栏的更多信息,请参阅《如何使用菜单》。

The Root Pane

每个顶层容器都依赖于一个隐藏的中间容器,称为 根窗格(root pane)。根窗格负责管理 内容窗格菜单栏,同时还管理其他一些容器。通常,在使用 Swing 组件时不需要了解根窗格。但如果你需要拦截鼠标点击事件,或者在多个组件上进行绘制时,就需要熟悉根窗格的概念。

以下是根窗格为窗口(以及其他顶层容器)提供的组件列表:

我们之前已经介绍过内容窗格和可选的菜单栏。根窗格提供的另外两个组件是 分层窗格(layered pane)玻璃窗格(glass pane)分层窗格 包含菜单栏和内容窗格,同时允许对其他组件进行 Z 轴排序(即组件的前后顺序)。玻璃窗格 通常用于拦截顶层容器上发生的输入事件,也可以用来在多个组件上进行绘制。

更多细节,请参阅《如何使用根窗格》。

The JComponent Class

除了顶层容器之外,所有名称以 “J” 开头的 Swing 组件都继承自 JComponent 类。例如,JPanelJScrollPaneJButtonJTable 都继承自 JComponent。然而,JFrameJDialog 没有继承它们,因为它们属于顶层容器。

JComponent 类继承自 Container 类,而 Container 类又继承自 Component 类。Component 类提供了从布局提示到绘制和事件支持等功能。而 Container 类则支持向容器中添加组件并对它们进行布局。本节的 API 表总结了 ComponentContainer 以及 JComponent 中最常用的方法。

JComponent Features

JComponent 类为其子类提供以下功能:

  • Tool tips
  • Painting and borders
  • Application-wide pluggable look and feel
  • Custom properties
  • Support for layout
  • Support for accessibility
  • Support for drag and drop
  • Double buffering
  • Key bindings

工具提示

通过 setToolTipText 方法指定一个字符串,你可以为组件提供帮助。当光标停留在组件上时,指定的字符串会显示在一个小窗口中,出现在组件附近。更多信息请参见《如何使用工具提示》。

绘制和边框

setBorder 方法允许你指定一个组件在其边缘显示的边框。要绘制组件的内部内容,可以重写 paintComponent 方法。有关详细信息,请参见《如何使用边框》和《执行自定义绘制》。

应用程序级的可插拔外观和感觉

在后台,每个 JComponent 对象都有一个相应的 ComponentUI 对象,负责为该 JComponent 执行所有绘制、事件处理、大小计算等操作。使用的具体 ComponentUI 对象取决于当前的外观和感觉,你可以通过 UIManager.setLookAndFeel 方法设置它。更多信息请参见《如何设置外观和感觉》。

自定义属性

你可以将一个或多个属性(名称/对象对)与任何 JComponent 关联。例如,布局管理器可以使用属性将约束对象与它管理的每个 JComponent 关联。可以通过 putClientPropertygetClientProperty 方法来设置和获取属性。有关属性的一般信息,请参见《属性》。

布局支持

虽然 Component 类提供了诸如 getPreferredSizegetAlignmentX 等布局提示方法,但它并没有提供设置这些布局提示的方式,除非创建一个子类并重写方法。为了提供另一种设置布局提示的方式,JComponent 类添加了设置方法 —— setMinimumSizesetMaximumSizesetAlignmentXsetAlignmentY。更多信息请参见《在容器内布局组件》。

可访问性支持

JComponent 类提供了 API 和基本功能,帮助辅助技术(如屏幕阅读器)从 Swing 组件中获取信息。更多关于可访问性的内容,请参见《如何支持辅助技术》。

拖放支持

JComponent 类提供了设置组件的传输处理器(transfer handler)的 API,这是 Swing 拖放支持的基础。更多信息请参见《拖放简介》。

双重缓冲

双重缓冲可以平滑屏幕绘制过程。有关详细信息,请参见《执行自定义绘制》。

键绑定

此功能使组件在用户按下键盘上的键时做出反应。例如,在许多外观和感觉中,当按钮获得焦点时,按下空格键就相当于鼠标点击该按钮。外观和感觉会自动设置按下和释放空格键之间的绑定,以及它对按钮的影响。更多关于键绑定的信息,请参见《如何使用键绑定》。

The JComponent API

JComponent 类提供了许多新方法,并继承了许多来自 ComponentContainer 的方法。以下表格总结了我们最常用的方法:

How to Use Various Components

以下每一页都描述了如何使用特定类型的 Swing 组件。

posted @ 2024-12-17 20:50  xkfx  阅读(26)  评论(0编辑  收藏  举报