SWING - 快速指南
SWING - Overview
Swing API是一组可扩展的GUI组件,可以简化开发人员的生活,创建基于JAVA的前端/ GUI应用程序。 它构建在AWT API之上,可以替代AWT API,因为它几乎具有与AWT控件相对应的每个控件。 Swing组件遵循模型 - 视图 - 控制器架构,以满足以下标准。
单个API足以支持多种外观。
API将由模型驱动,因此不需要最高级别的API来获取数据。
API是使用Java Bean模型,以便Builder Tools和IDE可以为开发人员提供更好的服务以供使用。
MVC架构
Swing API架构遵循基于松散的MVC架构,其方式如下。
模型表示组件的数据。
View表示组件数据的可视化表示。
Controller在视图上获取用户的输入,并反映Component的数据中的更改。
Swing组件将Model作为一个单独的元素,而View和Controller部分则在User Interface元素中进行了分组。 因此,Swing具有可插拔的外观架构。
摇摆功能
Light Weight - Swing组件独立于本机操作系统的API,因为Swing API控件主要使用纯JAVA代码而不是底层操作系统调用来呈现。
Rich Controls - Swing提供了一组丰富的高级控件,如Tree,TabbedPane,slider,colorpicker和table控件。
Highly Customizable - 可以通过非常简单的方式Highly Customizable摆动控件,因为视觉外观与内部表示无关。
Pluggable look-and-feel - 基于SWING的GUI应用程序外观可以在运行时根据可用值进行更改。
SWING - Environment Setup
本节将指导您如何在计算机上下载和设置Java。 请使用以下步骤设置环境。
Java SE可从链接Download Java免费获得。 因此,您可以下载基于您的操作系统的版本。
按照说明下载Java并运行.exe以在您的计算机上安装Java。 在计算机上安装Java后,需要将环境变量设置为指向正确的安装目录。
设置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' 。
设置Windows 95/98/ME的路径
假设您已在c:\Program Files\java\jdk目录中安装了Java -
Step 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编辑器 (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控件都从以下Component类层次结构继承属性。
S.No. | 类和描述 |
---|---|
1 | Component Component是SWING的非菜单用户界面控件的抽象基类。 Component表示具有图形表示的对象 |
2 | Container Container是可以包含其他SWING组件的组件 |
3 | JComponent JComponent是所有SWING UI组件的基类。 为了使用从JComponent继承的SWING组件,组件必须位于包含层次结构中,其根是顶级SWING容器 |
SWING UI元素
以下是使用SWING设计GUI时常用控件的列表。
S.No. | 类和描述 |
---|---|
1 | JLabel JLabel对象是用于在容器中放置文本的组件。 |
2 | JButton 该类创建一个带标签的按钮。 |
3 | JColorChooser JColorChooser提供了一个控件窗格,旨在允许用户操作和选择颜色。 |
4 | JCheck Box JCheckBox是一个图形组件,可以处于on (true)或off (false)状态。 |
5 | JRadioButton JRadioButton类是一个图形组件,可以处于on (true)或off (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 - Event Handling
在本章中,您将了解事件及其类型,并了解如何处理事件。 为了更好地理解,本章末尾提供了示例。
什么是事件? (What is an Event?)
对象状态的更改称为Event ,即事件描述源的状态更改。 由于用户与图形用户界面组件的交互而生成事件。 例如,单击按钮,移动鼠标,通过键盘输入字符,从列表中选择项目以及滚动页面是导致事件发生的活动。
事件类型
这些活动大致可分为两类 -
Foreground Events - 这些事件需要用户的直接交互。 它们是作为人与图形用户界面中的图形组件交互的结果而生成的。 例如,单击按钮,移动鼠标,通过键盘输入字符,从列表中选择项目,滚动页面等。
Background Events - 这些事件需要最终用户的交互。 操作系统中断,硬件或软件故障,计时器到期和操作完成是后台事件的一些示例。
什么是事件处理?
事件处理是控制事件并决定事件发生时应该发生什么的机制。 此机制具有一个代码,称为事件处理程序,在事件发生时执行。
Java使用委派事件模型来处理事件。 此模型定义了生成和处理事件的标准机制。
授权事件模型具有以下主要参与者。
Source - 源是事件发生的对象。 Source负责向其处理程序提供已发生事件的信息。 Java为我们提供了源对象的类。
Listener - 它也称为事件处理程序。 监听器负责生成对事件的响应。 从Java实现的角度来看,侦听器也是一个对象。 听众等待直到收到事件。 收到事件后,侦听器处理事件然后返回。
这种方法的好处是用户界面逻辑与生成事件的逻辑完全分离。 用户界面元素能够将事件的处理委托给单独的代码。
在此模型中,需要向源对象注册侦听器,以便侦听器可以接收事件通知。 这是处理事件的有效方式,因为事件通知仅发送给想要接收它们的侦听器。
涉及事件处理的步骤
Step 1 - 用户单击按钮并生成事件。
Step 2 - 自动创建相关事件类的对象,并在同一对象中填充有关源和事件的信息。
Step 3 - 将事件对象转发到已注册的侦听器类的方法。
Step 4 - 该方法被执行并返回。
关于监听器的要点
为了设计一个监听器类,您必须开发一些监听器接口。 这些Listener接口预测了一些公共抽象回调方法,这些方法必须由监听器类实现。
如果未实现任何预定义接口,则您的类不能充当源对象的侦听器类。
回调方法
这些是API提供程序提供的方法,由应用程序程序员定义并由应用程序开发人员调用。 这里的回调方法代表一个事件方法。 在响应事件时,java jre将触发回调方法。 所有这些回调方法都在监听器接口中提供。
如果组件想要某个侦听器监听其事件,则源必须将自己注册到侦听器。
事件处理示例
使用您选择的任何编辑器创建以下Java程序,例如D:/ 》 SWING 》 com 》 iowiki 》 gui 》
SwingControlDemo.java
package com.iowiki.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\iowiki\gui\SwingControlDemo.java
如果没有错误发生,则表示编译成功。 使用以下命令运行该程序。
D:\AWT>java com.iowiki.gui.SwingControlDemo
验证以下输出。
SWING - Event Classes
事件类代表事件。 Java提供了各种事件类,但是,只讨论那些更频繁使用的事件类。
EventObject类
它是从中派生所有事件状态对象的根类。 所有事件都是通过对对象( source的引用构造的,该对象在逻辑上被认为是最初发生事件的对象。 该类在java.util包中定义。
Class 声明 (Class Declaration)
以下是java.util.EventObject类的声明 -
public class EventObject
extends Object
implements Serializable
字段 (Field)
以下是java.util.EventObject类的字段 -
protected Object source - 事件最初发生的对象。
类构造函数 (Class Constructors)
Sr.No. | 构造函数和描述 |
---|---|
1 | EventObject(Object source) 构建一个典型的事件。 |
Class Methods
Sr.No. | 方法和描述 |
---|---|
1 | Object getSource() 事件最初发生的对象。 |
2 | String toString() 返回此EventObject的String表示形式。 |
方法继承 (Methods Inherited)
该类继承以下类中的方法 -
- java.lang.Object
SWING事件类
以下是常用事件类的列表。
Sr.No. | 类和描述 |
---|---|
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。
EventListner接口
它是每个侦听器接口必须扩展的标记接口。 该类在java.util包中定义。
Class 声明 (Class Declaration)
以下是java.util.EventListener接口的声明 -
public interface EventListener
SWING事件监听器接口
以下是常用事件侦听器的列表。
Sr.No. | 类和描述 |
---|---|
1 | ActionListener 此接口用于接收动作事件。 |
2 | ComponentListener 此接口用于接收组件事件。 |
3 | ItemListener 此接口用于接收项目事件。 |
4 | KeyListener 该接口用于接收密钥事件。 |
5 | MouseListener 该接口用于接收鼠标事件。 |
6 | WindowListener 该接口用于接收窗口事件。 |
7 | AdjustmentListener 该接口用于接收调整事件。 |
8 | ContainerListener 此接口用于接收容器事件。 |
9 | MouseMotionListener 该接口用于接收鼠标运动事件。 |
10 | FocusListener 该接口用于接收焦点事件。 |
SWING - Event Adapters
适配器是用于接收各种事件的抽象类。 这些类中的方法是空的。 这些类作为创建侦听器对象的便利而存在。
SWING适配器
以下是在SWING中监听GUI事件时常用适配器的列表。
Sr.No. | 适配器和说明 |
---|---|
1 | FocusAdapter 用于接收焦点事件的抽象适配器类。 |
2 | KeyAdapter 用于接收键事件的抽象适配器类。 |
3 | MouseAdapter 用于接收鼠标事件的抽象适配器类。 |
4 | MouseMotionAdapter 用于接收鼠标移动事件的抽象适配器类。 |
5 | WindowAdapter 用于接收窗口事件的抽象适配器类。 |
SWING - Layouts
布局是指容器内组件的排列。 换句话说,可以说布局将组件放置在容器内的特定位置。 布局控件的任务由布局管理器自动完成。
布局管理器
布局管理器自动定位容器中的所有组件。 即使您不使用布局管理器,组件仍然由默认布局管理器定位。 可以手动布置控制,但是由于以下两个原因,它变得非常困难。
处理容器内的大量控件非常繁琐。
通常,当我们需要安排它们时,不给出组件的宽度和高度信息。
Java提供了各种布局管理器来定位控件。 大小,形状和排列等属性因布局管理器而异。 当applet或应用程序窗口的大小发生变化时,组件的大小,形状和排列也会随响应而变化,即布局管理器会适应appletviewer或应用程序窗口的尺寸。
布局管理器与每个Container对象相关联。 每个布局管理器都是实现LayoutManager接口的类的对象。
以下是定义布局管理器功能的接口。
Sr.No. | 界面和描述 |
---|---|
1 | LayoutManager LayoutManager接口声明需要由类实现的那些方法,其对象将充当布局管理器。 |
2 | LayoutManager2 LayoutManager2是LayoutManager的子接口。 此接口适用于那些知道如何基于布局约束对象布局容器的类。 |
AWT布局管理器类
以下是使用AWT设计GUI时常用控件的列表。
Sr.No. | LayoutManager和描述 |
---|---|
1 | BorderLayout borderlayout安排组件适合五个区域:东,西,北,南和中心。 |
2 | CardLayout CardLayout对象将容器中的每个组件视为卡片。 一次只能看到一张卡片。 |
3 | FlowLayout FlowLayout是默认布局。 它以方向流布局组件。 |
4 | GridLayout GridLayout以矩形网格的形式管理组件。 |
5 | GridBagLayout 这是最灵活的布局管理器类。 GridBagLayout的对象垂直,水平或沿其基线对齐组件,而不需要相同大小的组件。 |
6 | GroupLayout GroupLayout对组件进行分层分组,以便将它们放置在Container中。 |
7 | SpringLayout SpringLayout根据一组约束定位其关联容器的子项。 |
SWING - Menu Classes
我们知道每个顶级窗口都有一个与之关联的菜单栏。 此菜单栏包含最终用户可用的各种菜单选项。 此外,每个选项都包含一个选项列表,称为下拉菜单。 Menu和MenuItem控件是MenuComponent类的子类。
菜单层次结构
菜单控件
Sr.No. | 类和描述 |
---|---|
1 | JMenuBar JMenuBar对象与顶级窗口关联。 |
2 | JMenuItem 菜单中的项必须属于JMenuItem或其任何子类。 |
3 | JMenu JMenu对象是一个从菜单栏显示的下拉菜单组件。 |
4 | JCheckboxMenuItem JCheckboxMenuItem是JMenuItem的子类。 |
5 | JRadioButtonMenuItem JRadioButtonMenuItem是JMenuItem的子类。 |
6 | JPopupMenu JPopupMenu可以在组件内的指定位置动态弹出。 |
SWING - Containers
容器是SWING GUI组件的组成部分。 容器提供可以定位组件的空间。 AWT中的Container本身就是一个组件,它提供了向自身添加组件的功能。 以下是需要考虑的一些值得注意的要点。
Container的子类称为Container。 例如,JPanel,JFrame和JWindow。
Container只能向自身添加一个Component。
每个容器中都存在一个默认布局,可以使用setLayout方法覆盖它。
SWING容器
以下是使用SWING设计GUI时常用容器的列表。
Sr.No. | 容器和描述 |
---|---|
1 | Panel JPanel是最简单的容器。 它提供了可以放置任何其他组件的空间,包括其他面板。 |
2 | Frame JFrame是一个带有标题和边框的顶级窗口。 |
3 | Window JWindow对象是一个没有边框且没有菜单栏的顶级窗口。 |