- Swing 教程
- Swing - 首页
- Swing - 概述
- Swing - 环境配置
- Swing - 控件
- Swing - 事件处理
- Swing - 事件类
- Swing - 事件监听器
- Swing - 事件适配器
- Swing - 布局
- Swing - 菜单
- Swing - 容器
- Swing 有用资源
- Swing 快速指南
- Swing - 有用资源
- Swing - 讨论
Swing 快速指南
Swing - 概述
Swing API 是一套可扩展的 GUI 组件,旨在简化开发人员创建基于 JAVA 的前端/GUI 应用程序的工作。它构建在 AWT API 之上,并作为 AWT API 的替代品,因为它几乎拥有与 AWT 控件相对应的所有控件。Swing 组件遵循模型-视图-控制器架构以满足以下条件。
单个 API 必须足以支持多种外观和感觉。
API 必须是模型驱动的,因此最高级别的 API 不需要拥有数据。
API 必须使用 Java Bean 模型,以便构建工具和 IDE 可以为开发人员提供更好的服务。
MVC 架构
Swing API 架构遵循如下所示的松散的 MVC 架构。
模型表示组件的数据。
视图表示组件数据的可视化表示。
控制器接收用户在视图上的输入,并反映组件数据的变化。
Swing 组件将模型作为单独的元素,而视图和控制器部分则组合在用户界面元素中。因此,Swing 具有可插拔的外观和感觉架构。
Swing 特性
**轻量级** - Swing 组件独立于本地操作系统的 API,因为 Swing API 控件主要使用纯 JAVA 代码而不是底层操作系统调用来呈现。
**丰富的控件** - Swing 提供了一套丰富的先进控件,例如树、选项卡窗格、滑块、颜色选择器和表格控件。
**高度可定制** - Swing 控件可以很容易地定制,因为视觉外观独立于内部表示。
**可插拔的外观和感觉** - 基于 SWING 的 GUI 应用程序的外观和感觉可以在运行时根据可用值进行更改。
Swing - 环境设置
本节指导您如何在计算机上下载和设置 Java。请按照以下步骤设置环境。
Java SE 可从以下链接免费获取 下载 Java。因此,您可以根据您的操作系统下载相应的版本。
按照说明下载 Java 并运行 **.exe** 文件以在您的计算机上安装 Java。在计算机上安装 Java 后,您需要设置环境变量以指向正确的安装目录。
为 Windows 2000/XP 设置路径
假设您已将 Java 安装在 **c:\Program Files\java\jdk** 目录中 -
**步骤 1** - 右键单击“我的电脑”,然后选择“属性”。
**步骤 2** - 在“高级”选项卡下单击“环境变量”按钮。
**步骤 3** - 修改“Path”变量,使其也包含 Java 可执行文件的路径。例如,如果路径当前设置为 **'C:\WINDOWS\SYSTEM32'**,则将路径更改为 **'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin'**。
为 Windows 95/98/ME 设置路径
假设您已将 Java 安装在 **c:\Program Files\java\jdk** 目录中 -
**步骤 1** - 编辑 **'C:\autoexec.bat'** 文件,并在末尾添加以下行:**'SET PATH=%PATH%;C:\Program Files\java\jdk\bin'**。
为 Linux、UNIX、Solaris、FreeBSD 设置路径
应将环境变量 PATH 设置为指向 Java 二进制文件安装的位置。如果您遇到问题,请参考您的 Shell 文档。
例如,如果您使用 **bash** 作为您的 shell,则您需要在 **'.bashrc: export PATH=/path/to/java:$PATH'** 末尾添加以下行。
常用的 Java 编辑器
要编写 Java 程序,您需要一个文本编辑器。市场上甚至还有更复杂的 IDE 可用。但就目前而言,您可以考虑以下其中一种 -
**记事本** - 在 Windows 机器上,您可以使用任何简单的文本编辑器,如记事本(本教程推荐)、TextPad。
**Netbeans** - Netbeans 是一个开源且免费的 Java IDE,可以从 https://www.netbeans.org/index.html 下载。
**Eclipse** - Eclipse 也是由 Eclipse 开源社区开发的 Java IDE,可以从 https://www.eclipse.org/ 下载。
Swing - 控件
每个用户界面都考虑以下三个主要方面 -
**UI 元素** - 这些是用户最终看到并与之交互的核心可视元素。GWT 提供了大量广泛使用和常见的元素,从基本到复杂,我们将在本教程中介绍。
**布局** - 它们定义了 UI 元素如何在屏幕上组织,并为 GUI(图形用户界面)提供最终的外观和感觉。这部分将在布局章节中介绍。
**行为** - 这些是用户与 UI 元素交互时发生的事件。这部分将在事件处理章节中介绍。
每个 Swing 控件都继承自以下组件类层次结构的属性。
序号 | 类和描述 |
---|---|
1 | Component
Component 是 Swing 非菜单用户界面控件的抽象基类。Component 代表具有图形表示的对象 |
2 | Container
Container 是可以包含其他 Swing 组件的组件 |
3 | JComponent
JComponent 是所有 Swing UI 组件的基类。为了使用继承自 JComponent 的 Swing 组件,该组件必须位于其根为顶级 Swing 容器的包含层次结构中 |
Swing UI 元素
以下是使用 Swing 设计 GUI 时常用的控件列表。
序号 | 类和描述 |
---|---|
1 | JLabel
JLabel 对象是用于在容器中放置文本的组件。 |
2 | JButton
此类创建一个带标签的按钮。 |
3 | JColorChooser
JColorChooser 提供一组控件窗格,旨在允许用户操作和选择颜色。 |
4 | JCheckBox
JCheckBox 是一个图形组件,可以处于 **开启** (true) 或 **关闭** (false) 状态。 |
5 | JRadioButton
JRadioButton 类是一个图形组件,可以处于 **开启** (true) 或 **关闭** (false) 状态,在一个组中。 |
6 | JList
JList 组件向用户呈现一个可滚动的文本项列表。 |
7 | JComboBox
JComboBox 组件向用户呈现一个显示选项菜单的选择。 |
8 | JTextField
JTextField 对象是一个文本组件,允许编辑单行文本。 |
9 | JPasswordField
JPasswordField 对象是一个专门用于密码输入的文本组件。 |
10 | JTextArea
JTextArea 对象是一个文本组件,允许编辑多行文本。 |
11 | ImageIcon
ImageIcon 控件是 Icon 接口的实现,用于从图像绘制图标 |
12 | JScrollbar
Scrollbar 控件代表一个滚动条组件,以便用户可以从一系列值中进行选择。 |
13 | JOptionPane
JOptionPane 提供一组标准对话框,用于提示用户输入值或告知用户某些信息。 |
14 | JFileChooser
JFileChooser 控件表示一个对话框窗口,用户可以在其中选择文件。 |
15 | JProgressBar
随着任务进展到完成,进度条会显示任务的完成百分比。 |
16 | JSlider
JSlider 允许用户通过在有界区间内滑动旋钮来以图形方式选择值。 |
17 | JSpinner
JSpinner 是一个单行输入字段,允许用户从有序序列中选择数字或对象值。 |
Swing - 事件处理
在本章中,您将学习事件及其类型,还将学习如何处理事件。本章末尾提供了示例,以便更好地理解。
什么是事件?
对象状态的变化称为 **事件**,即事件描述了源状态的变化。事件是由于用户与图形用户界面组件交互而生成的。例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目和滚动页面是导致事件发生的活动。
事件类型
事件大致可分为两类 -
**前台事件** - 这些事件需要用户的直接交互。它们是由于一个人与图形用户界面中的图形组件交互而产生的结果。例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目、滚动页面等。
**后台事件** - 这些事件需要最终用户的交互。操作系统中断、硬件或软件故障、计时器到期和操作完成是一些后台事件的示例。
什么是事件处理?
事件处理是控制事件并决定事件发生时应发生什么的机制。此机制具有称为事件处理程序的代码,该代码在事件发生时执行。
Java 使用委托事件模型来处理事件。此模型定义了生成和处理事件的标准机制。
委托事件模型具有以下关键参与者。
**源** - 源是发生事件的对象。源负责向其处理程序提供已发生事件的信息。Java 为源对象提供了类。
**监听器** - 也称为事件处理程序。监听器负责生成对事件的响应。从 Java 实现的角度来看,监听器也是一个对象。监听器等待直到收到事件。一旦收到事件,监听器就会处理事件然后返回。
这种方法的好处是用户界面逻辑与生成事件的逻辑完全分离。用户界面元素能够将事件的处理委托给单独的代码。
在此模型中,需要将监听器注册到源对象,以便监听器可以接收事件通知。这是一种高效的事件处理方式,因为事件通知仅发送给希望接收它们的那些监听器。
事件处理涉及的步骤
**步骤 1** - 用户单击按钮并生成事件。
**步骤 2** - 自动创建相关事件类的对象,并且有关源和事件的信息将填充到同一个对象中。
**步骤 3** - 事件对象被转发到已注册监听器类的的方法。
**步骤 4** - 方法被执行并返回。
关于监听器的要点
为了设计监听器类,您必须开发一些监听器接口。这些监听器接口预测一些公共抽象回调方法,这些方法必须由监听器类实现。
如果您没有实现任何预定义的接口,那么您的类就不能充当源对象的监听器类。
回调方法
这些是由 API 提供者提供的、由应用程序程序员定义并由应用程序开发人员调用的方法。这里的回调方法表示事件方法。响应事件,Java JRE 将触发回调方法。所有这些回调方法都在监听器接口中提供。
如果组件希望某些监听器监听其事件,则源必须将自身注册到监听器。
事件处理示例
使用您选择的任何编辑器,在D:/ > SWING > com > tutorialspoint > gui >目录下创建以下Java程序。
SwingControlDemo.java
package com.tutorialspoint.gui; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SwingControlDemo { private JFrame mainFrame; private JLabel headerLabel; private JLabel statusLabel; private JPanel controlPanel; public SwingControlDemo(){ prepareGUI(); } public static void main(String[] args){ SwingControlDemo swingControlDemo = new SwingControlDemo(); swingControlDemo.showEventDemo(); } private void prepareGUI(){ mainFrame = new JFrame("Java SWING Examples"); mainFrame.setSize(400,400); mainFrame.setLayout(new GridLayout(3, 1)); headerLabel = new JLabel("",JLabel.CENTER ); statusLabel = new JLabel("",JLabel.CENTER); statusLabel.setSize(350,100); mainFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent windowEvent){ System.exit(0); } }); controlPanel = new JPanel(); controlPanel.setLayout(new FlowLayout()); mainFrame.add(headerLabel); mainFrame.add(controlPanel); mainFrame.add(statusLabel); mainFrame.setVisible(true); } private void showEventDemo(){ headerLabel.setText("Control in action: Button"); JButton okButton = new JButton("OK"); JButton submitButton = new JButton("Submit"); JButton cancelButton = new JButton("Cancel"); okButton.setActionCommand("OK"); submitButton.setActionCommand("Submit"); cancelButton.setActionCommand("Cancel"); okButton.addActionListener(new ButtonClickListener()); submitButton.addActionListener(new ButtonClickListener()); cancelButton.addActionListener(new ButtonClickListener()); controlPanel.add(okButton); controlPanel.add(submitButton); controlPanel.add(cancelButton); mainFrame.setVisible(true); } private class ButtonClickListener implements ActionListener{ public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if( command.equals( "OK" )) { statusLabel.setText("Ok Button clicked."); } else if( command.equals( "Submit" ) ) { statusLabel.setText("Submit Button clicked."); } else { statusLabel.setText("Cancel Button clicked."); } } } }
使用命令提示符编译程序。进入D:/ > SWING目录,然后输入以下命令。
D:\AWT>javac com\tutorialspoint\gui\SwingControlDemo.java
如果未出现错误,则表示编译成功。使用以下命令运行程序。
D:\AWT>java com.tutorialspoint.gui.SwingControlDemo
验证以下输出。
Swing - 事件类
事件类表示事件。Java提供了各种事件类,但这里只讨论最常用的几种。
EventObject 类
它是所有事件状态对象都应从中派生的根类。所有事件都使用对对象的引用(即源)来构造,该对象在逻辑上被认为是事件最初发生的对象。此类在java.util包中定义。
类声明
以下是java.util.EventObject类的声明:
public class EventObject extends Object implements Serializable
字段
以下是java.util.EventObject类的字段:
protected Object source − 事件最初发生的对象。
类构造函数
序号 | 构造函数和说明 |
---|---|
1 |
EventObject(Object source) 构造一个原型事件。 |
类方法
序号 | 方法和说明 |
---|---|
1 |
Object getSource() 事件最初发生的对象。 |
2 |
String toString() 返回此EventObject的字符串表示形式。 |
继承的方法
此类继承自以下类的方法:
- java.lang.Object
Swing 事件类
以下是常用事件类的列表。
序号 | 类和描述 |
---|---|
1 | AWTEvent
它是所有Swing事件的根事件类。此类及其子类取代了原来的java.awt.Event类。 |
2 | ActionEvent
单击按钮或双击列表项时会生成ActionEvent。 |
3 | InputEvent
InputEvent类是所有组件级输入事件的根事件类。 |
4 | KeyEvent
输入字符时会生成KeyEvent。 |
5 | MouseEvent
此事件表示组件中发生了鼠标操作。 |
6 | WindowEvent
此类的对象表示窗口状态的更改。 |
7 | AdjustmentEvent
此类的对象表示可调整对象发出的调整事件。 |
8 | ComponentEvent
此类的对象表示窗口状态的更改。 |
9 | ContainerEvent
此类的对象表示窗口状态的更改。 |
10 | MouseMotionEvent
此类的对象表示窗口状态的更改。 |
11 | PaintEvent
此类的对象表示窗口状态的更改。 |
Swing - 事件监听器
事件监听器表示负责处理事件的接口。Java提供了各种事件监听器类,但这里只讨论最常用的几种。事件监听器方法的每个方法都有一个参数,该参数是一个EventObject类的子类的对象。例如,鼠标事件监听器方法将接受MouseEvent的实例,其中MouseEvent派生自EventObject。
EventListener 接口
这是一个标记接口,每个监听器接口都必须扩展它。此类在java.util包中定义。
类声明
以下是java.util.EventListener接口的声明:
public interface EventListener
Swing 事件监听器接口
以下是常用事件监听器的列表。
序号 | 类和描述 |
---|---|
1 | ActionListener
此接口用于接收操作事件。 |
2 | ComponentListener
此接口用于接收组件事件。 |
3 | ItemListener
此接口用于接收项目事件。 |
4 | KeyListener
此接口用于接收键盘事件。 |
5 | MouseListener
此接口用于接收鼠标事件。 |
6 | WindowListener
此接口用于接收窗口事件。 |
7 | AdjustmentListener
此接口用于接收调整事件。 |
8 | ContainerListener
此接口用于接收容器事件。 |
9 | MouseMotionListener
此接口用于接收鼠标移动事件。 |
10 | FocusListener
此接口用于接收焦点事件。 |
Swing - 事件适配器
适配器是用于接收各种事件的抽象类。这些类中的方法是空的。这些类作为创建监听器对象的便捷方式而存在。
Swing 适配器
以下是监听Swing中GUI事件时常用的适配器列表。
序号 | 适配器和说明 |
---|---|
1 | FocusAdapter
一个用于接收焦点事件的抽象适配器类。 |
2 | KeyAdapter
一个用于接收键盘事件的抽象适配器类。 |
3 | MouseAdapter
一个用于接收鼠标事件的抽象适配器类。 |
4 | MouseMotionAdapter
一个用于接收鼠标移动事件的抽象适配器类。 |
5 | WindowAdapter
一个用于接收窗口事件的抽象适配器类。 |
Swing - 布局
布局是指容器内组件的排列方式。换句话说,布局就是在容器中将组件放置在特定位置。布局管理器自动完成布局控件的任务。
布局管理器
布局管理器自动将所有组件放置在容器内。即使不使用布局管理器,组件仍然由默认布局管理器进行定位。可以手动布局控件,但是由于以下两个原因,这会变得非常困难。
处理容器中的大量控件非常繁琐。
通常,在需要排列组件时,不会给出组件的宽度和高度信息。
Java提供了各种布局管理器来定位控件。大小、形状和排列等属性因布局管理器而异。当小程序或应用程序窗口的大小发生变化时,组件的大小、形状和排列也会相应地发生变化,即布局管理器会适应小程序查看器或应用程序窗口的尺寸。
布局管理器与每个容器对象相关联。每个布局管理器都是实现LayoutManager接口的类的对象。
以下是定义布局管理器功能的接口。
序号 | 接口和说明 |
---|---|
1 | LayoutManager
LayoutManager接口声明了其对象将充当布局管理器的类需要实现的方法。 |
2 | LayoutManager2
LayoutManager2是LayoutManager的子接口。此接口适用于那些知道如何根据布局约束对象布局容器的类。 |
AWT 布局管理器类
以下是使用AWT设计GUI时常用的控件列表。
序号 | 布局管理器和说明 |
---|---|
1 | BorderLayout
BorderLayout将组件排列在五个区域中:东、西、北、南和中心。 |
2 | CardLayout
CardLayout对象将容器中的每个组件视为一张卡片。一次只能看到一张卡片。 |
3 | FlowLayout
FlowLayout是默认布局。它按方向流布局组件。 |
4 | GridLayout
GridLayout以矩形网格的形式管理组件。 |
5 | GridBagLayout
这是最灵活的布局管理器类。GridBagLayout的对象垂直、水平或沿基线对齐组件,而无需组件大小相同。 |
6 | GroupLayout
GroupLayout以分层方式对组件进行分组,以便将它们定位在容器中。 |
7 | SpringLayout
SpringLayout根据一组约束来定位其关联容器的子项。 |
Swing - 菜单类
我们知道每个顶级窗口都关联着一个菜单栏。此菜单栏包含最终用户可用的各种菜单选项。此外,每个选项都包含一个选项列表,称为下拉菜单。菜单和MenuItem控件是MenuComponent类的子类。
菜单层次结构
菜单控件
序号 | 类和描述 |
---|---|
1 | JMenuBar
JMenuBar对象与顶级窗口相关联。 |
2 | JMenuItem
菜单中的项目必须属于JMenuItem或其任何子类。 |
3 | JMenu
JMenu对象是从菜单栏显示的下拉菜单组件。 |
4 | JCheckboxMenuItem
JCheckboxMenuItem是JMenuItem的子类。 |
5 | JRadioButtonMenuItem
JRadioButtonMenuItem是JMenuItem的子类。 |
6 | JPopupMenu
JPopupMenu可以在组件内的指定位置动态弹出。 |
Swing - 容器
容器是Swing GUI组件的组成部分。容器提供一个组件可以放置的空间。AWT中的容器本身就是一个组件,它提供了将组件添加到自身的功能。以下是一些需要注意的事项。
容器的子类称为容器。例如,JPanel、JFrame和JWindow。
容器只能将组件添加到自身。
每个容器中都存在一个默认布局,可以使用setLayout方法覆盖它。
Swing 容器
以下是使用Swing设计GUI时常用的容器列表。
序号 | 容器和说明 |
---|---|
1 | 面板
JPanel是最简单的容器。它提供了一个空间,可以在其中放置任何其他组件,包括其他面板。 |
2 | 框架
JFrame是一个带有标题和边框的顶级窗口。 |
3 | 窗口
JWindow对象是一个没有边框和菜单栏的顶级窗口。 |