使用Swing组件
译自https://docs.oracle.com/javase/tutorial/uiswing/components/index.html
课程介绍
Using Top-Level Containers
本章讲解了如何使用 JFrame
、JDialog
和 JApplet
类共享的功能——内容窗格、菜单栏和根窗格。还讨论了容器层次结构,即顶层容器所包含的组件树。
The JComponent Class
本节介绍了 JComponent
提供给其子类的功能——几乎所有 Swing 组件都继承自 JComponent
,并提供了一些如何利用这些功能的建议。本节最后列出了 API 表,描述了 JComponent
及其父类 Container
和 Component
定义的常用 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):JFrame
、JDialog
和 JApplet
。在使用这些类时,你应该牢记以下几点:
- 为了在屏幕上显示,每个 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
来创建独立应用程序,但相同的概念也适用于 JApplet
和 JDialog
。
以下是该示例 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
方法及其变体 remove
和 setLayout
方法已被重写,以根据需要将操作转发到内容窗格(contentPane)。这意味着你可以直接写:
frame.add(child);
这样 child
会被添加到内容窗格(contentPane)中。
需要注意的是,只有这三个方法会进行这样的转发。因此,调用 getLayout()
时不会返回通过 setLayout()
设置的布局管理器。
Adding a Menu Bar
理论上,所有顶层容器都可以包含一个菜单栏。但实际上,菜单栏通常只出现在 JFrame 和 JApplet 中。要为顶层容器添加菜单栏,需要创建一个 JMenuBar 对象,将菜单添加到其中,然后调用 setJMenuBar
方法。
在 TopLevelDemo 示例中,以下代码将菜单栏添加到了窗口中:
frame.setJMenuBar(greenMenuBar);
有关实现菜单和菜单栏的更多信息,请参阅《如何使用菜单》。
The Root Pane
每个顶层容器都依赖于一个隐藏的中间容器,称为 根窗格(root pane)。根窗格负责管理 内容窗格 和 菜单栏,同时还管理其他一些容器。通常,在使用 Swing 组件时不需要了解根窗格。但如果你需要拦截鼠标点击事件,或者在多个组件上进行绘制时,就需要熟悉根窗格的概念。
以下是根窗格为窗口(以及其他顶层容器)提供的组件列表:
我们之前已经介绍过内容窗格和可选的菜单栏。根窗格提供的另外两个组件是 分层窗格(layered pane) 和 玻璃窗格(glass pane)。分层窗格 包含菜单栏和内容窗格,同时允许对其他组件进行 Z 轴排序(即组件的前后顺序)。玻璃窗格 通常用于拦截顶层容器上发生的输入事件,也可以用来在多个组件上进行绘制。
更多细节,请参阅《如何使用根窗格》。
The JComponent Class
除了顶层容器之外,所有名称以 “J” 开头的 Swing 组件都继承自 JComponent
类。例如,JPanel
、JScrollPane
、JButton
和 JTable
都继承自 JComponent
。然而,JFrame
和 JDialog
没有继承它们,因为它们属于顶层容器。
JComponent
类继承自 Container
类,而 Container
类又继承自 Component
类。Component
类提供了从布局提示到绘制和事件支持等功能。而 Container
类则支持向容器中添加组件并对它们进行布局。本节的 API 表总结了 Component
、Container
以及 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
关联。可以通过 putClientProperty
和 getClientProperty
方法来设置和获取属性。有关属性的一般信息,请参见《属性》。
布局支持
虽然 Component
类提供了诸如 getPreferredSize
和 getAlignmentX
等布局提示方法,但它并没有提供设置这些布局提示的方式,除非创建一个子类并重写方法。为了提供另一种设置布局提示的方式,JComponent
类添加了设置方法 —— setMinimumSize
、setMaximumSize
、setAlignmentX
和 setAlignmentY
。更多信息请参见《在容器内布局组件》。
可访问性支持
JComponent
类提供了 API 和基本功能,帮助辅助技术(如屏幕阅读器)从 Swing 组件中获取信息。更多关于可访问性的内容,请参见《如何支持辅助技术》。
拖放支持
JComponent
类提供了设置组件的传输处理器(transfer handler)的 API,这是 Swing 拖放支持的基础。更多信息请参见《拖放简介》。
双重缓冲
双重缓冲可以平滑屏幕绘制过程。有关详细信息,请参见《执行自定义绘制》。
键绑定
此功能使组件在用户按下键盘上的键时做出反应。例如,在许多外观和感觉中,当按钮获得焦点时,按下空格键就相当于鼠标点击该按钮。外观和感觉会自动设置按下和释放空格键之间的绑定,以及它对按钮的影响。更多关于键绑定的信息,请参见《如何使用键绑定》。
The JComponent API
JComponent
类提供了许多新方法,并继承了许多来自 Component
和 Container
的方法。以下表格总结了我们最常用的方法:
- Customizing Component Appearance
- Setting and Getting Component State
- Handling Events
- Painting Components
- Dealing with the Containment Hierarchy
- Laying Out Components
- Getting Size and Position Information
- Specifying Absolute Size and Position
How to Use Various Components
以下每一页都描述了如何使用特定类型的 Swing 组件。
- How to Make Applets
- How to Use Buttons, Check Boxes, and Radio Buttons
- How to Use Color Choosers
- How to Use Combo Boxes
- How to Make Dialogs
- How to Use Editor Panes and Text Panes
- How to Use File Choosers
- How to Use Formatted Text Fields
- How to Make Frames (Main Windows)
- How to Use Internal Frames
- How to Use Labels
- How to Use Layered Panes
- How to Use Lists
- How to Use Menus
- How to Use Panels
- How to Use Password Fields
- How to Use Progress Bars
- How to Use Root Panes
- How to Use Scroll Panes
- How to Use Separators
- How to Use Sliders
- How to Use Spinners
- How to Use Split Panes
- How to Use Tabbed Panes
- How to Use Tables
- How to Use Text Areas
- How to Use Text Fields
- How to Use Tool Bars
- How to Use Tool Tips
- How to Use Trees