Swing 简明教程
SWING - Overview
Swing API 是可扩展 GUI 组件集,可帮助开发者轻而易举地创建基于 Java 的前端/GUI 应用程序。它建立在 AWT API 之上,可替代 AWT API,因为它几乎每个控件都对应到 AWT 控件。Swing 组件遵循模型-视图-控制器架构以满足以下准则。
-
单个 API 就足以支持多种外观和感觉。
-
API 应是模型驱动的,以便最高级别的 API 不需要有数据。
-
API 应使用 Java Bean 模型,以便构建工具和 IDE 能够为开发者提供更好的使用服务。
SWING - Environment Setup
本部分将指导您如何在计算机上下载和设置 Java。请使用以下步骤设置环境。
Java SE 可从链接 Download Java 中免费获取。因此,您可以根据操作系统下载版本。
按照说明下载 Java 并运行 .exe 在计算机上安装 Java。在计算机上安装 Java 后,您需要设置环境变量以指向正确的安装目录。
Setting Up the Path for Windows 2000/XP
假设您已在 c:\Program Files\java\jdk 目录中安装了 Java−
Step 1 − 右键单击“我的电脑”并选择“属性”。
Step 2 − 单击“高级”选项卡下的“环境变量”按钮。
Step 3 − 更改“Path”变量,以便它还包含 Java 可执行文件的路径。例如,如果路径当前设置为 'C:\WINDOWS\SYSTEM32' ,请将路径更改为 'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin' 。
Setting Up the Path for Windows 95/98/ME
假设您已在 c:\Program Files\java\jdk 目录中安装了 Java−
Step 1 − 编辑 'C:\autoexec.bat' 文件并在末尾添加以下行: 'SET PATH=%PATH%;C:\Program Files\java\jdk\bin' 。
Setting Up the Path for Linux, UNIX, Solaris, FreeBSD
环境变量 PATH 应设置为指向 Java 二进制文件已安装的位置。如果您在执行此操作时遇到问题,请参阅 Shell 文档。
例如,如果您使用 bash 作为 shell,则您会在结尾 '.bashrc: export PATH=/path/to/java:$PATH' 添加以下行。
Popular Java Editors
为了编写 Java 程序,您需要文本编辑器。市场上还有功能更强大的 IDE。但是目前,您可以考虑以下选项之一−
-
Notepad − 在 Windows 机器上,您可以使用任何简单的文本编辑器,如记事本(推荐用于本教程)、TextPad。
-
Netbeans − Netbeans 是免费且开放源码的 Java IDE,可以从 https://www.netbeans.org/index.html 处下载。
-
Eclipse − Eclipse 也是一个由 Eclipse 开源社区开发的 Java IDE,可以从 https://www.eclipse.org/ 处下载。
SWING - Controls
每个用户界面都考虑以下三个主要方面:
-
UI Elements − 这些是用户最终看到并与之交互的核心可视元素。GWT 提供了广泛使用的常用元素的列表,从基本到复杂,我们将在本教程中介绍。
-
Layouts - 它们定义了 UI 元素应该如何组织在屏幕上,并为 GUI(图形用户界面)提供最终的外观和感觉。这部分将在布局章节中介绍。
-
Behavior − 这些是用户与 UI 元素交互时发生的事件。本部分将在事件处理章节中介绍。
每个 SWING 控件都从以下组件类层次继承属性。
S.No. |
Class & Description |
1 |
Component 组件是 SWING 的非菜单用户界面控件的抽象基类。组件表示具有图形表示的对象 |
2 |
Container 容器是一个可以包含其他 SWING 组件的组件 |
3 |
JComponent JComponent 是所有 SWING UI 组件的基类。为了使用从 JComponent 继承的 SWING 组件,该组件必须处于包含层次结构中,其根是顶级 SWING 容器 |
SWING UI Elements
以下是使用 SWING 设计 GUI 时常用的控件列表。
S.No. |
Class & Description |
1 |
JLabel JLabel 对象是在容器中放置文本的组件。 |
2 |
JButton 此类创建带标签的按钮。 |
3 |
JColorChooser JColorChooser 提供一个控件窗格,使用户能够操作和选择颜色。 |
4 |
JCheck Box JCheckbox 是一个图形组件,可以处于 on (真)或 off (假)状态。 |
5 |
JRadioButton JRadioButton 类是一个图形组件,可以处于一组中的 on (真)或 off (假)状态。 |
6 |
JList A JList 组件向用户显示可滚动的文本项目列表。 |
7 |
JComboBox A JComboBox 组件向用户显示选择弹出菜单。 |
8 |
JTextField A JTextField 对象是一个文本组件,允许编辑单行文本。 |
9 |
JPasswordField A JPasswordField 对象是一个专门用于密码输入的文本组件。 |
10 |
JTextArea A JTextArea 对象是一个文本组件,允许编辑多行文本。 |
11 |
ImageIcon A ImageIcon 控件是对 Icon 接口的实现,该接口从图像绘制图标 |
12 |
JScrollbar A Scrollbar 控件表示一个滚动条组件,以便用户能够从值的范围内进行选择。 |
13 |
JOptionPane JOptionPane 提供一组标准对话框,它向用户提示值或告知用户某些信息。 |
14 |
JFileChooser A JFileChooser 控件表示一个对话框窗口,用户可以从中选择文件。 |
15 |
JProgressBar 随着任务接近完成,进度条会显示任务的完成百分比。 |
16 |
JSlider A JSlider 允许用户通过在有界间隔内滑动旋钮来以图形方式选择值。 |
17 |
JSpinner A JSpinner 是一个单行输入字段,允许用户从有序序列中选择数字或对象值。 |
SWING - Event Handling
在本章中,你将了解事件、其类型,以及如何处理事件。本文末尾提供了示例,以帮助你更好地理解。
What is an Event?
对象的上述状态变化称为 Event ,即事件描述了源状态的变化。事件是用户与图形用户界面组件交互的结果而生成的。例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目以及滚动页面都是导致事件发生的活动。
Types of Event
事件可以大致分为两类 −
-
Foreground Events − 这些事件需要用户的直接交互。它们是由于用户与图形用户界面中的图形组件交互而产生的。例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目、滚动页面等。
-
Background Events − 这些事件需要最终用户的交互。操作系统中断、硬件或软件故障、计时器到期和操作完成是一些后台事件的示例。
What is Event Handling?
事件处理是控制事件并决定如果发生事件应发生什么的机制。此机制具有一个代码,称为事件处理程序,该代码在事件发生时执行。
Java 使用委派事件模型来处理事件。此模型定义了生成和处理事件的标准机制。
委托事件模型具有以下关键参与者。
-
Source −源是发生事件的对象。源负责向处理程序提供已发生事件的信息。Java 为我们提供了源对象类。
-
Listener −它也被称为事件处理程序。侦听器负责对事件生成响应。从 Java 实现的角度来看,侦听器也是一个对象。侦听器等待接收事件。一旦接收到事件,侦听器便处理事件,然后再返回。
此方法的优点是,用户界面逻辑与生成事件的逻辑完全分离。用户界面元素能够将事件处理委托给单独的一段代码。
在此模型中,侦听器需要向源对象注册,以便侦听器可以接收事件通知。这是一种处理事件的有效方法,因为只有希望接收事件的侦听器才会收到事件通知。
Steps Involved in Event Handling
Step 1 −用户单击按钮,生成事件。
Step 2 −自动创建有关事件类的对象,并将有关源和事件的信息填充到同一对象中。
Step 3 −事件对象转到已注册侦听器类的,方法。
Step 4 −该方法得到执行并返回。
Points to Remember About the Listener
-
为了设计侦听器类,您必须开发一些侦听器接口。这些侦听器接口预测一些公共抽象回调方法,这些方法必须由侦听器类实现。
-
如果您没有实现任何预定义的接口,那么您的类不能作为源对象的侦听器类。
Callback Methods
这些方法由 API 供应商提供并且由应用程序程序员定义,由应用程序开发人员调用。此处,回调方法表示事件方法。响应事件,java jre 将激发回调方法。所有此类回调方法都包含在侦听器接口中。
如果某个组件希望有侦听器来侦听其事件,则源必须向侦听器注册自身。
Event Handling Example
使用您选择的任意编辑器,使用以下命令创建 Java 程序,例如 D:/ > SWING > com > tutorialspoint > gui >
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 - Event Classes
事件类表示事件。Java 提供各种事件类,但仅讨论最常用的事件类。
EventObject Class
它是所有事件状态对象派生的根类。所有事件均使用对对象的引用 source 构造,该对象在逻辑上被认为是事件最初发生的上的对象。此类在 java.util 包中定义。
Class Declaration
以下是对 java.util.EventObject 类的声明 −
public class EventObject
extends Object
implements Serializable
Class Methods
Sr.No. |
Method & Description |
1 |
Object getSource() 最初发生事件的对象。 |
2 |
String toString() 返回此 EventObject 的字符串表示形式。 |
SWING Event Classes
以下是常用事件类的列表。
Sr.No. |
Class & Description |
1 |
AWTEvent 它是所有 SWING 事件的根事件类。该类及其子类取代了原始的 java.awt.Event 类。 |
2 |
ActionEvent 在单击按钮或双击列表项时生成 ActionEvent。 |
3 |
InputEvent InputEvent 类是所有组件级输入事件的根事件类。 |
4 |
KeyEvent 在输入字符时生成 Key 事件。 |
5 |
MouseEvent 此事件表示在组件中发生了鼠标操作。 |
6 |
WindowEvent 此类的对象表示窗口状态的更改。 |
7 |
AdjustmentEvent 此类的对象表示 Adjustable 对象发出的调整事件。 |
8 |
ComponentEvent 此类的对象表示窗口状态的更改。 |
9 |
ContainerEvent 此类的对象表示窗口状态的更改。 |
10 |
MouseMotionEvent 此类的对象表示窗口状态的更改。 |
11 |
PaintEvent 此类的对象表示窗口状态的更改。 |
SWING - Event Listeners
事件侦听器表示负责处理事件的接口。Java 提供各种事件侦听器类,但我们只讨论使用最频繁的那些类。每个事件侦听器方法的一个方法只有一个参数,该参数是一个对象,它是 EventObject 类的子类。例如,鼠标事件侦听器方法接受 MouseEvent 的实例,其中 MouseEvent 派生自 EventObject。
SWING Event Listener Interfaces
以下是常用事件侦听器的列表。
Sr.No. |
Class & Description |
1 |
ActionListener 该接口用于接收操作事件。 |
2 |
ComponentListener 该接口用于接收组件事件。 |
3 |
ItemListener 此界面用于接收项目事件。 |
4 |
KeyListener 此界面用于接收关键事件。 |
5 |
MouseListener 此界面用于接收鼠标事件。 |
6 |
WindowListener 此界面用于接收窗口事件。 |
7 |
AdjustmentListener 此界面用于接收调整事件。 |
8 |
ContainerListener 此界面用于接收容器事件。 |
9 |
MouseMotionListener 此界面用于接收鼠标移动事件。 |
10 |
FocusListener 此界面用于接收焦点事件。 |
SWING - Event Adapters
适配器是接收各种事件的抽象类。这些类中的方法为空。这些类作为创建侦听器对象的一种方便方式而存在。
SWING Adapters
以下列出了 SWING 中用于侦听 GUI 事件的常见适配器列表。
Sr.No. |
Adapter & Description |
1 |
FocusAdapter 用于接收焦点事件的抽象适配器类。 |
2 |
KeyAdapter 用于接收键盘事件的抽象适配器类。 |
3 |
MouseAdapter 用于接收鼠标事件的抽象适配器类。 |
4 |
MouseMotionAdapter 用于接收鼠标移动事件的抽象适配器类。 |
5 |
WindowAdapter 用于接收窗口事件的抽象适配器类。 |
SWING - Layouts
布局是指容器内组件的排列。从另一个角度来说,也可以说布局是在容器内将组件放置在特定位置。放置控件的任务由布局管理器自动完成。
Layout Manager
布局管理器自动定位容器内的所有组件。即使您不使用布局管理器,组件仍然会由默认布局管理器定位。动手放置控件是可能的,但是由于以下两个原因,这变得非常困难。
-
在容器中处理大量控件非常繁琐。
-
通常,当我们需要排列组件时,并未提供组件的宽度和高度信息。
Java 提供了各种布局管理器来定位控件。诸如大小、形状和排列之类的属性在不同的布局管理器之间各不相同。当 applet 或应用程序窗口的大小改变时,组件的大小、形状和排列也会相应地改变,即布局管理器适应 applet 查看器或应用程序窗口的尺寸。
布局管理器与容器对象相关联。每个布局管理器都是实现 LayoutManager 接口的类的对象。
以下是定义布局管理器功能的接口。
Sr.No. |
Interface & Description |
1 |
LayoutManager LayoutManager 接口声明了需要由其对象充当布局管理器的类的那些方法。 |
2 |
LayoutManager2 LayoutManager2 是 LayoutManager 的子接口。此接口适用于那些知道如何基于布局约束对象布局容器的类。 |
AWT Layout Manager Classes
以下是使用 AWT 设计 GUI 时常用的控件列表。
Sr.No. |
LayoutManager & Description |
1 |
BorderLayout BorderLayout 排列组件以适合五个区域:东、西、北、南和中心。 |
2 |
CardLayout CardLayout 对象将容器中的每个组件视为一个卡片。一次只能看到一张卡片。 |
3 |
FlowLayout FlowLayout 是默认布局。它以定向流形式布局组件。 |
4 |
GridLayout GridLayout 以矩形网格的形式管理组件。 |
5 |
GridBagLayout 这是最灵活的布局管理器类。GridBagLayout 对象垂直、水平或沿着其基线对齐组件,而不需要相同大小的组件。 |
6 |
GroupLayout GroupLayout 按层次结构对组件进行分组,以便将其放置在容器中。 |
7 |
SpringLayout SpringLayout 根据一组约束将与之关联的容器的子代定位。 |
SWING - Menu Classes
众所周知,每个顶级窗口都与它关联有一个菜单栏。此菜单栏由最终用户使用的各种菜单选项组成。此外,每个选项都包含一个称为下拉菜单的列表。菜单和 MenuItem 控件是 MenuComponent 类的子类。
Menu Controls
Sr.No. |
Class & Description |
1 |
JMenuBar JMenuBar 对象与顶级窗口相关联。 |
2 |
JMenuItem 菜单中的项必须属于 JMenuItem 或其任何子类。 |
3 |
JMenu JMenu 对象是从菜单栏显示的下拉菜单组件。 |
4 |
JCheckboxMenuItem JCheckboxMenuItem 是 JMenuItem 的子类。 |
5 |
JRadioButtonMenuItem JRadioButtonMenuItem 是 JMenuItem 的子类。 |
6 |
JPopupMenu JPopupMenu 可以动态地弹出在组件内的指定位置。 |