SWING - 快速指南
SWING - 概述
Swing API 是一组可扩展的 GUI 组件,可让开发人员轻松创建基于 JAVA 的前端/GUI 应用程序。它构建在 AWT API 之上,并作为 AWT API 的替代品,因为它几乎拥有与 AWT 控件相对应的所有控件。Swing 组件遵循模型-视图-控制器架构来满足以下条件。
单个 API 足以支持多种外观。
API 是模型驱动的,因此最高级别的 API 不需要有数据。
API就是利用Java Bean模型,让Builder Tools和IDE能够更好的服务给开发者使用。
MVC架构
Swing API 架构以下列方式遵循松散的基于 MVC 架构。
模型代表组件的数据。
视图表示组件数据的可视化表示。
控制器在视图上获取用户的输入并反映组件数据的变化。
Swing 组件将模型作为单独的元素,而视图和控制器部分则集中在用户界面元素中。因此,Swing 具有可插入的外观架构。
秋千特点
轻量级- Swing 组件独立于本机操作系统的 API,因为 Swing API 控件主要使用纯 JAVA 代码而不是底层操作系统调用来呈现。
丰富的控件- Swing 提供了一组丰富的高级控件,例如 Tree、TabbedPane、滑块、颜色选择器和表格控件。
高度可定制- 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(图形用户界面)提供最终的外观和感觉。这部分将在布局章节中介绍。
Behave- 这些是用户与 UI 元素交互时发生的事件。这部分内容将在事件处理章节中介绍。
每个 SWING 控件都从以下 Component 类层次结构继承属性。
编号 | 类别和描述 |
---|---|
1 | 成分
Component 是 SWING 的非菜单用户界面控件的抽象基类。组件用图形表示来表示对象 |
2 | 容器
容器是可以包含其他 SWING 组件的组件 |
3 | J组件
JComponent 是所有 SWING UI 组件的基类。为了使用从 JComponent 继承的 SWING 组件,该组件必须位于根为顶级 SWING 容器的包含层次结构中 |
SWING 用户界面元素
以下是使用 SWING 设计 GUI 时常用的控件列表。
编号 | 类别和描述 |
---|---|
1 | J标签
JLabel 对象是用于将文本放置在容器中的组件。 |
2 | J按钮
此类创建一个带标签的按钮。 |
3 | J颜色选择器
JColorChooser 提供了一个控件窗格,旨在允许用户操作和选择颜色。 |
4 | J复选框
JCheckBox 是一个图形组件,可以处于打开(true) 或关闭(false) 状态。 |
5 | J单选按钮
JRadioButton 类是一个图形组件,可以处于打开(true) 或关闭(false) 状态。在一组。 |
6 | 列表
JList 组件向用户呈现文本项的滚动列表。 |
7 | J组合框
JComboBox 组件向用户提供一个显示选项菜单。 |
8 | 文本字段
JTextField 对象是一个文本组件,允许编辑单行文本。 |
9 | J密码字段
JPasswordField 对象是专门用于密码输入的文本组件。 |
10 | 文本区
JTextArea 对象是一个文本组件,允许编辑多行文本。 |
11 | 图像图标
ImageIcon 控件是 Icon 接口的实现,可从图像绘制图标 |
12 | JScrollbar
滚动条控件表示滚动条组件,以便用户能够从值范围中进行选择。 |
13 | J选项面板
JOptionPane 提供了一组标准对话框,提示用户输入值或通知他们某些信息。 |
14 | 文件选择器
JFileChooser 控件代表一个对话框窗口,用户可以从中选择文件。 |
15 | J进度条
随着任务逐渐完成,进度条会显示任务的完成百分比。 |
16 | JS滑块
JSlider 允许用户通过在有限的间隔内滑动旋钮来以图形方式选择一个值。 |
17 号 | JSpinner
JSpinner 是一个单行输入字段,允许用户从有序序列中选择数字或对象值。 |
SWING - 事件处理
在本章中,您将了解事件及其类型,并了解如何处理事件。本章末尾提供了示例,以便更好地理解。
什么是事件?
对象状态的变化称为事件,即事件描述源状态的变化。事件是作为用户与图形用户界面组件交互的结果而生成的。例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目以及滚动页面都是导致事件发生的活动。
活动类型
这些事件可大致分为两类 -
前台事件- 这些事件需要用户的直接交互。它们是作为人与图形用户界面中的图形组件交互的结果而生成的。例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目、滚动页面等。
后台事件- 这些事件需要最终用户的交互。操作系统中断、硬件或软件故障、计时器到期和操作完成是后台事件的一些示例。
什么是事件处理?
事件处理是控制事件并决定事件发生时应该发生什么的机制。该机制有一个称为事件处理程序的代码,该代码在事件发生时执行。
Java 使用委托事件模型来处理事件。该模型定义了生成和处理事件的标准机制。
委托活动模型有以下主要参与者。
源- 源是事件发生的对象。源负责向其处理程序提供发生事件的信息。Java为我们提供了源对象的类。
侦听器- 也称为事件处理程序。侦听器负责生成对事件的响应。从Java实现的角度来看,监听器也是一个对象。侦听器等待直到收到事件。一旦接收到事件,监听器就会处理该事件然后返回。
这种方法的好处是用户界面逻辑与生成事件的逻辑完全分离。用户界面元素能够将事件的处理委托给单独的代码段。
在该模型中,侦听器需要向源对象注册,以便侦听器可以接收事件通知。这是处理事件的有效方法,因为事件通知仅发送给那些想要接收它们的侦听器。
事件处理涉及的步骤
步骤 1 - 用户单击按钮并生成事件。
步骤 2 - 自动创建相关事件类的对象,并将有关源和事件的信息填充到同一对象中。
步骤 3 - 事件对象被转发到注册侦听器类的方法。
步骤 4 - 该方法被执行并返回。
关于倾听者需要记住的要点
为了设计监听器类,您必须开发一些监听器接口。这些Listener接口预测了一些公共抽象回调方法,这些方法必须由监听器类实现。
如果您没有实现任何预定义的接口,那么您的类就不能充当源对象的侦听器类。
回调方法
这些是由 API 提供者提供、由应用程序程序员定义并由应用程序开发人员调用的方法。这里的回调方法代表一个事件方法。为了响应事件,java jre 将触发回调方法。所有此类回调方法都在侦听器接口中提供。
如果组件希望某个侦听器侦听其事件,则源必须将自身注册到侦听器。
事件处理示例
使用您选择的任何编辑器创建以下 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 - 活动类别
事件类代表事件。Java 提供了各种 Event 类,但是,仅讨论那些更常用的事件类。
事件对象类
它是所有事件状态对象派生的根类。所有事件都是通过对对象(源)的引用来构造的,源在逻辑上被认为是相关事件最初发生的对象。该类定义在java.util包中。
类别声明
以下是java.util.EventObject类的声明-
public class EventObject extends Object implements Serializable
场地
以下是java.util.EventObject类的字段-
protected Object source - 事件最初发生的对象。
类构造函数
先生。 | 构造函数及描述 |
---|---|
1 |
事件对象(对象源) 构造一个原型事件。 |
类方法
先生。 | 方法及说明 |
---|---|
1 |
对象 getSource() 最初发生事件的对象。 |
2 |
字符串转字符串() 返回此 EventObject 的字符串表示形式。 |
继承的方法
该类继承了以下类的方法 -
- java.lang.Object
SWING 活动课程
以下是常用事件类的列表。
先生。 | 类别和描述 |
---|---|
1 | AWT事件
它是所有 SWING 事件的根事件类。该类及其子类取代了原始的java.awt.Event类。 |
2 | 动作事件
单击按钮或双击列表项时会生成 ActionEvent。 |
3 | 输入事件
InputEvent 类是所有组件级输入事件的根事件类。 |
4 | 关键事件
输入字符时会生成按键事件。 |
5 | 鼠标事件
该事件表示组件中发生了鼠标操作。 |
6 | 窗口事件
该类的对象表示窗口状态的变化。 |
7 | 调整事件
该类的对象表示由Adjustable对象发出的调整事件。 |
8 | 组件事件
该类的对象表示窗口状态的变化。 |
9 | 容器事件
该类的对象表示窗口状态的变化。 |
10 | 鼠标移动事件
该类的对象表示窗口状态的变化。 |
11 | 绘制事件
该类的对象表示窗口状态的变化。 |
SWING - 事件监听器
事件监听器代表负责处理事件的接口。Java 提供了各种事件监听器类,但是,我们只讨论那些更常用的事件监听器类。事件侦听器方法的每个方法都有一个作为对象的参数,该对象是 EventObject 类的子类。例如,鼠标事件侦听器方法将接受 MouseEvent 的实例,其中 MouseEvent 派生自 EventObject。
事件监听器接口
它是每个侦听器接口都必须扩展的标记接口。该类定义在java.util包中。
类别声明
以下是java.util.EventListener接口的声明-
public interface EventListener
SWING 事件监听器接口
以下是常用事件侦听器的列表。
先生。 | 类别和描述 |
---|---|
1 | 动作监听器
该接口用于接收动作事件。 |
2 | 组件监听器
该接口用于接收组件事件。 |
3 | 项目监听器
该接口用于接收item事件。 |
4 | 按键监听器
该接口用于接收按键事件。 |
5 | 鼠标监听器
该接口用于接收鼠标事件。 |
6 | 窗口监听器
该接口用于接收窗口事件。 |
7 | 调整监听器
该接口用于接收调整事件。 |
8 | 容器监听器
该接口用于接收容器事件。 |
9 | 鼠标移动监听器
该接口用于接收鼠标移动事件。 |
10 | 焦点监听器
该接口用于接收焦点事件。 |
SWING - 事件适配器
适配器是用于接收各种事件的抽象类。这些类中的方法是空的。这些类的存在是为了方便创建侦听器对象。
SWING 适配器
以下是在 SWING 中侦听 GUI 事件时常用的适配器的列表。
先生。 | 适配器及说明 |
---|---|
1 | 焦点适配器
用于接收焦点事件的抽象适配器类。 |
2 | 钥匙适配器
用于接收按键事件的抽象适配器类。 |
3 | 鼠标适配器
用于接收鼠标事件的抽象适配器类。 |
4 | 鼠标移动适配器
用于接收鼠标运动事件的抽象适配器类。 |
5 | 窗口适配器
用于接收窗口事件的抽象适配器类。 |
SWING - 布局
布局是指容器内组件的排列。换句话说,布局可以说是将组件放置在容器内的特定位置。布局控件的任务由布局管理器自动完成。
布局管理器
布局管理器自动定位容器内的所有组件。即使您不使用布局管理器,组件仍然由默认布局管理器定位。可以手动布置控件,但是,由于以下两个原因,这变得非常困难。
在容器内处理大量的控件是非常繁琐的。
通常,当我们需要排列组件时,不会给出组件的宽度和高度信息。
Java 提供了各种布局管理器来定位控件。尺寸、形状和排列等属性因布局管理器而异。当小应用程序或应用程序窗口的大小改变时,组件的大小、形状和排列也相应地改变,即布局管理器适应小应用程序查看器或应用程序窗口的尺寸。
布局管理器与每个容器对象相关联。每个布局管理器都是实现 LayoutManager 接口的类的一个对象。
以下是定义布局管理器功能的接口。
先生。 | 接口及说明 |
---|---|
1 | 布局管理器
LayoutManager 接口声明了类需要实现的方法,该类的对象将充当布局管理器。 |
2 | 布局管理器2
LayoutManager2是LayoutManager的子接口。该接口适用于那些知道如何基于布局约束对象来布局容器的类。 |
AWT 布局管理器类
以下是使用 AWT 设计 GUI 时常用的控件列表。
先生。 | 布局管理器和描述 |
---|---|
1 | 边框布局
边框布局将组件排列为适合五个区域:东、西、北、南和中心。 |
2 | 卡片布局
CardLayout 对象将容器中的每个组件视为一张卡片。一次只能看到一张卡。 |
3 | 流式布局
FlowLayout 是默认布局。它将组件按定向流进行布局。 |
4 | 网格布局
GridLayout 以矩形网格的形式管理组件。 |
5 | 网格包布局
这是最灵活的布局管理器类。GridBagLayout 的对象可以垂直、水平或沿基线对齐组件,而不需要相同大小的组件。 |
6 | 组布局
GroupLayout 对组件进行分层分组,以便将它们放置在容器中。 |
7 | Spring布局
SpringLayout 根据一组约束来定位其关联容器的子级。 |
SWING - 菜单类
我们知道,每个顶级窗口都有一个与之关联的菜单栏。该菜单栏包含最终用户可用的各种菜单选项。此外,每个选项都包含一个选项列表,称为下拉菜单。Menu 和 MenuItem 控件是 MenuComponent 类的子类。
菜单层次结构
菜单控制
先生。 | 类别和描述 |
---|---|
1 | J菜单栏
JMenuBar 对象与顶级窗口关联。 |
2 | J菜单项
菜单中的项目必须属于 JMenuItem 或其任何子类。 |
3 | J菜单
JMenu 对象是一个从菜单栏显示的下拉菜单组件。 |
4 | JCheckbox菜单项
JCheckboxMenuItem 是 JMenuItem 的子类。 |
5 | JRadioButton菜单项
JRadioButtonMenuItem 是 JMenuItem 的子类。 |
6 | J弹出菜单
JPopupMenu 可以在组件内的指定位置动态弹出。 |
SWING - 容器
容器是 SWING GUI 组件的一个组成部分。容器提供了可以放置组件的空间。AWT 中的容器本身就是一个组件,并且它提供向自身添加组件的功能。以下是需要考虑的一些值得注意的要点。
Container的子类称为Container。例如,JPanel、JFrame 和 JWindow。
容器只能向其自身添加一个组件。
每个容器中都存在默认布局,可以使用setLayout方法覆盖它。
摇摆容器
以下是使用 SWING 设计 GUI 时常用的容器列表。