Table of Contents
设置 Linux,UNIX,Solaris,FreeBSD 的路径:
前言
JAVA 提供了一组丰富的库来用平台独立的方式创建图形用户界面。在本文中我们将学习 SWING GUI 控件。
读者
本教程是为愿意学习 JAVA GUI 来用简易的步骤编程的软件专业人员而设计的。本教程将会给你带来对 JAVA GUI 编程的概念有更好的理解,并且在完成本教程之后,你将会把自己的专业知识提升到一个较高的水平。
预备知识
在继续学习本教程之前,你应该对 Java 编程语言、文本编辑器和执行程序等有一个基本的了解。
更新日期 | 更新内容 |
2015-07-24 | SWING 教程 |
1
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 特点
- 轻量级 —— Swing 组件是独立的本地操作系统的 API,因为 Swing API 控件通常采用纯 JAVA 代码而不是采用底层的操作系统调用来呈现。
- 丰富的控件 —— Swing 提供了一组丰富的先进的控件,如树,页签窗体,滑动条,颜色选择器,表格控件
- 高级自定义 —— Swing 控件可以用非常简单的方法来自定义,因为可视化外观是独立于内部表示的。
- 可插拔的外观和风格 —— 基于 Swing 的 GUI 应用程序的外观和风格可以在运行时根据有效的值改变。
2
SWING - 环境安装
本节将指导你如何在你的机器上下载和设置 Java。请按照以下步骤来设置环境。
在链接 Download Java 上, Java SE 免费提供的。所以你根据你的操作系统下载一个版本。
在你的机器上,按照说明下载 java 和运行 .exe 来安装 Java。一旦在你的机器上安装了 Java,你将需要设置环境变量来指向正确的安装目录:
设置 windows 2000/XP 的路径:
假设你已经在 c:\Program Files\java\jdk 目录上安装了 Java:
- 右击 ‘我的电脑’,并且选择 ‘属性’。
- 点击 ‘高级’ 标签下的 ‘环境变量’ 按钮。
- 现在更改 ‘路径’ 变量,以便它也包含 Java 可执行文件的路径。例如,如果路径当前设置为 C:\WINDOWS\SYSTEM32
,然后更改你的路径为 C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin
。
设置 windows 95/98/ME 的路径:
假设你已经在 c:\Program Files\java\jdk 目录上安装了 Java:
- 编辑 C:\autoexec.bat
文件,并且在最后添加下行: SET PATH=%PATH%;C:\Program Files\java\jdk\bin
设置 Linux,UNIX,Solaris,FreeBSD 的路径:
环境变量路径应该设置为指向 java 二进制文件已经安装的位置。如果你在这方面遇到困难,参考你的 shell 文档。
例如,如果你使用 bash 作为你的 shell,然后你将添加下行到最后 .bashrc: export PATH=/path/to/java:$PATH
流行的 Java 编辑器:
为了编写 Java 程序,你将需要一个文本编辑器。在市场上有甚至更复杂的可用 IDE。但是现在,你可以考虑下列之一:
- Notepad: 在 Windows 机器上,你可以使用任何简单的文本编辑器,如 Notepad(本教程推荐),TextPad。
- Netbeans:是一个开源而且免费的 Java IDE,它可以从 http://www.netbeans.org/index.html 下载。
- Eclipse: 也是一个 Java IDE,它是由 eclipse 开源社区开发的,可以从 http://www.eclipse.org/ 下载。
3
SWING - 控件
每个用户界面考虑有以下三个主要方面:
- UI 元素: 有用户最终看到并且与之交互的核心视觉元素。GWT 提供了一个大量的广泛使用和常见的元素列表,本教程我们将涉及从基本到复杂的变化。
- 布局: 他们定义应该如何在屏幕上组织 UI 元素,并且提供一个最终的外观和风格给 GUI(图形用户界面)。这部分将在布局这一章涉及。
- 行为: 当用户与 UI 元素交互时,这些事件发生。这部分将在事件处理这一章涉及。
每个 SWING 控件从下列组件类的等级继承属性。
序号 | 类 & 描述 |
1 | Component |
2 | Container |
3 | JComponent |
SWING UI 元素:
下列是当使用 SWING 来设计 GUI 时常用的控件列表。
Sr. No. | 控件 & 描述 |
1 | JLabel |
2 | JButton |
3 | JColorChooser |
4 | JCheck Box |
5 | JRadioButton |
6 | JList |
7 | JComboBox |
8 | JTextField |
9 | JPasswordField |
10 | JTextArea |
11 | ImageIcon |
12 | JScrollbar |
13 | JOptionPane |
14 | JFileChooser |
15 | JProgressBar |
16 | JSlider |
17 | JSpinner |
4
SWING 事件处理
改变对象的状态被称为事件,即事件描述源的状态变化。事件产生用户与图形用户界面组件交互的结果。例如,点击一个按钮,移动鼠标,通过键盘输入一个字符,从列表中选择一个项目,滚动页面都是导致一个事件发生的活动。
事件的类型
事件可以大致分为两类::
- 前台事件 - 这些事件需要用户的直接互动。它们是由在图形用户界面中人与图形组件交互的结果而产生的。例如,点击一个按钮,移动鼠标,通过键盘输入一个字符,从列表中选择一个项目,滚动页面等。
- 后台事件 - 这些事件需要最终用户的交互,它们被称为后台事件。操作系统的中断,硬件或软件故障,计时器过期,操作完成都是后台事件的例子。
什么是事件处理?
事件处理是一种机制,如果一个事件发生时,它控制该事件,并且决定应该会发生什么。这种机制具有被称为事件处理程序的代码,当一个事件发生时,它是可执行的。Java 使用代理事件模型来处理事件。该模型定义了标准的机制来生成和处理事件。让我们来简要介绍这个模型。
代理事件模型具有下列主要参与者,即:
- 源 - 源是一个对象,事件发生在该对象上。源负责提供发生事件的信息给它的处理器。Java 提供源对象的类。
- 监听器 - 它也被称为作为事件处理。监听器负责产生对一个事件的响应。从 Java 实现的角度来看,监听器也是一个对象。监听器等待直到它接收到一个事件。一旦收到该事件,监听器进程的事件就返回。
这种方法的好处是,用户界面逻辑完全从生成事件的逻辑中分开。用户界面元素能够把事件的处理委派给一段单独的代码。在这个模型中,监听器需要用源对象注册,以便监听器能够接收事件通知。这是一个有效的处理事件的方式,因为这些事件通知只发送给那些想要接收它们的监听器。
事件处理所涉及的步骤
- 用户单击按钮,然后生成事件。
- 现在有关事件类的对象是自动创建的,源和事件的信息在同一对象得到填充。
- 事件对象被转发到注册监听器类的方法中。
- 该方法现在得到执行并且返回。
有关监听器要记住的要点
- 为了设计一个监听器类,我们必须开发一些监听器接口。这些监听器接口预测一些公共的抽象回调方法,这些方法必须由监听器类来实现。
- 如果你没有实现任何预定义的接口,那么你的类不能作为源对象的监听器类。
回调方法
这些方法由 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
验证下面的输出
5
SWING 事件类
事件类代表事件。Java 提供各种事件类,但是我们将讨论更频繁使用的那些事件类。
EventObject 类
它是派生所有事件状态对象的根类。所有事件都是用对象,源的引用来构造的,即逻辑上认为是问题最初发生的事件的对象。这个类定义在 java.util 包中。
类声明
下面是 java.util.EventObject 类的声明:
public class EventObject
extends Object
implements Serializable
字段
下面是 java.util.EventObject 类的字段:
- protected Object source –- 事件最初发生的对象。
类构造函数
S.N. | 构造函数 & 描述 |
1 | EventObject(Object source) |
类方法
S.N. | 方法 & 描述 |
1 | Object getSource() |
2 | String toString() |
方法继承
这个类从下面的类中继承方法:
- java.lang.Object
SWING 事件类:
下面是常用的事件类。
Sr. No. | 控件 & 描述 |
1 | AWTEvent |
2 | ActionEvent |
3 | InputEvent |
4 | KeyEvent |
5 | MouseEvent |
6 | WindowEvent |
7 | AdjustmentEvent |
8 | ComponentEvent |
9 | ContainerEvent |
10 | MouseMotionEvent |
11 | PaintEvent |
6
SWING 事件监听器
事件监听器代表负责处理事件的接口。Java 提供了各种事件监听器类,但我们将讨论更频繁使用的那些事件监听器类。一个事件监听器的每个方法有一个参数作为一个对象,该对象是 EventObject 类的子类。例如,鼠标事件监听器的方法将接受 MouseEvent 的实例,其中 MouseEvent 是 EventObject 派生的。
EventListner 接口
它是一个标记接口,每一个监听器接口必须扩展它。这个类定义在 java.util 包中。
类声明
下面是 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 |
7
SWING 事件适配器
适配器是用于接收各种事件的抽象类。这些类中的方法是空的。这些类的存在是为了方便创建监听器对象。
SWING 适配器:
下面是当在 SWING 中监听 GUI 事件时常用的适配器列表。
Sr. No. | 适配器 & 描述 |
1 | FocusAdapter |
2 | KeyAdapter |
3 | MouseAdapter |
4 | MouseMotionAdapter |
5 | WindowAdapter |
8
SWING 布局
布局意味着容器内组件的安排。我们可以说,用其他方式在容器的特定位置放置组件。布局控件的任务是由布局管理器自动完成的。
布局管理器
布局管理器自动放置容器内的所有组件。如果我们不使用布局管理器,然后组件也能由默认的布局管理器放置。手工布局控件也是可能的,但是由于以下两个原因,它变得非常困难。
- 在容器内处理大量的控件是非常繁琐的。
- 通常当我们需要安排组件时,没有给出该组件的宽度和高度信息,。
Java 为我们提供了各种布局管理器来放置控件。属性如大小,形状和排列从一个布局管理器到其他的布局管理器变化。当小应用程序或应用程序窗口的大小改变时,组件的大小,形状和排列的组件也相应的变化,即布局管理器适应小应用程序视图或应用程序窗口的尺寸。
布局管理器与每一个容器对象相关联。每一个布局管理器是实现布局管理接口的类的一个对象。
下面是接口定义的布局管理器的功能。
序号 | 接口 & 描述 |
1 | LayoutManager |
2 | LayoutManager2 |
AWT 布局管理器类:
下面是当使用 AWT 设计 GUI 时常用的控件列表。
序号 | 布局管理器 & 描述 |
1 | BorderLayout |
2 | CardLayout |
3 | FlowLayout |
4 | GridLayout |
5 | GridBagLayout |
6 | GroupLayout |
7 | SpringLayout |
9
SWING 菜单类
正如我们所知道每个顶层窗口有一个菜单栏与它相关联。这个菜单栏包括各种菜单可用的选择给最终用户。而且每个选择包含被称为下拉菜单的选项列表。菜单和菜单项的控件都是 MenuComponent 类的子类。
菜单层次结构
菜单控件
Sr. No. | 控件 & 描述 |
1 | JMenuBar |
2 | JMenuItem |
3 | JMenu |
4 | JCheckBoxMenuItem |
5 | JRadioButtonMenuItem |
6 | JPopupMenu |
10
SWING 容器
容器是 SWING GUI 组件的组成部分。一个容器提供了一个可以放置组件的空间。在 AWT 中,一个容器是组件本身,并且它增加了功能来添加组件本身。下面是需要考虑的注意事项。
- 容器的子类被称为容器。例如 JPanel,JFrame 和 JWindow。
- 容器可以仅仅添加组件到自身。
- 一个默认的布局使用 setLayout 方法来呈现在每个可以被重写的容器中。
SWING 容器:
下面是当使用 SWING 设计 GUI 事件时常用的容器列表。
序号 | 容器 & 描述 |
1 | Panel |
2 | Frame |
3 | Window |
更多信息请访问




