图形用户界面(GUI)是程序与用户进行交流的图像窗口。GUI由若干GUI组件(Component)组成。GUI组件是可见的对象,用户可以通过鼠标或键盘对它进行操作,通过对不同事件的响应,来完成组件与用户之间或组件与组件之间的交互。
Java的抽象窗口工具包(AWT)是图形用户界面的基础。AWT组件库为各类Java应用程序提供了多种GUI工具。Swing是建立在AWT基础之上的,通过引入新特性和丰富的功能,Swing提供了一套用Java语言编写的GUI组件以保证可移植性。Swing提供了比AWT更全面的组件集合。因此,本章详细介绍Swing组件。
本章主要内容
& Java图形用户界面初步
& 事件处理
& 布局管理
& Swing组件
& 图形设计
图形用户界面(Graphical User Interface,GUI)是为应用程序提供一个图形化的界面,程序通过GUI与用户交互,GUI能使一个应用程序具有与众不同的“外观”与“感觉”。有了GUI,用户就不必花很多时间去记忆各个键盘序列的功能,从而把更多的时间投入到有效地使用应用程序本身上。图10-1给出了Microsoft Internet Explorer浏览器的GUI。
图10-1 Microsoft Internet Explorer浏览器的GUI
GUI由若干GUI组件(Component)组成。GUI组件是可见的对象,用户可以通过鼠标或键盘对它进行操作,通过对不同事件的响应,来完成组件与用户之间或组件与组件之间的交互。
Java基类(Java Foundation Classes,JFC)是关于GUI组件和服务的完整集合,它大大简化了健壮的Java应用程序的开发和部署。JFC作为Java2SDK的一个组成部分,主要由5个API构成:AWT、Swing、Java2D、Drag and Drop、Accessibility,如图10-2所示。
图10-2 JFC的组成
AWT组件库为各类Java应用程序提供了多种GUI工具。
Swing提供了一套用Java语言编写的GUI组件以保证可移植性。
Java2D是一种图形API,它为Java应用程序提供了高级的二维(2D)图形图像处理类的集合,同时,该API还包含了一套扩展字体集合。
Drag and Drop技术提供了Java和本地应用程序之间的交互性,用来在Java应用程序和不支持Java技术的应用程序之间交换数据。
Accessibility API提供了一套高级工具,可以辅助开发使用非传统输入和输出方式的应用程序,它提供了一个辅助技术接口,如屏幕阅读器、屏幕放大器、听觉文本阅读器(语音处理)等。
AWT(Abstract Window Toolkit)是一个独立平台的窗口工具组件集,它依赖于对等组件(Peer),而对等组件是一个本地GUI组件,由AWT类管理。AWT的作用是给用户提供基本的界面组件,如按钮、列表框、菜单等。
AWT组件中,包含对其对等组件的大量实用操作。例如使用AWT创建了一个Menu类的实例,那么Java运行系统将创建一个菜单对等组件的实例,而且由创建的对等组件实际执行菜单的显示与管理。在创建菜单实例时,Solaris JDK将产生一个Motif菜单对等组件,Windows JDK将产生一个Windows菜单对等组件等。这样,对等组件保护着每个平台的本地外观和感觉,但是可以在移植时改变它们的大小和位置,因为它们在不同的平台上可能会有不同的大小,也许还有不同的行为。而AWT类仅是对等组件外围的包装与操作工具,因此,对等组件可以快速产生一个GUI工具组件。
AWT最初只包括与本地对等组件相关联的的组件,称为重量组件(Heavyweight Component)。这些组件在它们自己的本地不透明窗口中绘制,在改变其默认行为时,不可以为其扩展子类;此外,它们必须是矩形的,且不能有透明背景。因此,在AWT1.1版本中引入了轻量组件(Light-Weight Component)的概念。
轻量组件没有本地对等组件,它不在本地不透明窗口中绘制,而是在它们的重量容器窗口中绘制,它们直接扩展java.awt.Compone类或java.awt.Containenr类。轻量组件不会损失与它们关联的不透明窗口性能,它们可以有透明的背景及非矩形的外观,但在轻量组件的容器中必须有一个是重量组件,否则无法在窗口内绘制轻量组件。
Swing是建立在AWT基础之上的,它用来代替AWT中的重量组件,而不是用来替代AWT本身。它利用了AWT的底层组件,包括图形、颜色、字体、工具包和布局管理器等。它使用AWT最好的部分来建立一个新的轻量组件集,而丢弃了AWT中有问题的重量组件部分。
Swing支持可插接观感(Pluggable Look-and-Feel),可插接的观感可使开发人员构建这样的应用程序:这些应用程序可在任何平台上执行,就好像是专门为某个特定平台而开发的一样。例如,在Microsoft Windows环境中执行的程序,似乎是专为这个环境而开发的;而同样的程序在UNIX平台上执行,其行为又似乎是专为UNIX环境开发的。
通过引入新特性和丰富的功能,Swing提供了比AWT更全面的组件集合。Swing API是围绕实现AWT各个部分的API构建的,这保证了所有早期的AWT组件仍然可以使用。
容器是组件的抽象子类,在该类中允许装入其他的组件,要装入的组件也可以是容器,在这些窗口中还可以装入其他的组件,这样可以创建完整的层次结构。容器有助于在屏幕上布置GUI组件。最常用的容器是Panel和Frame。
AWT(抽象窗口工具包)是Java提供的建立图形用户界面的工具包,AWT可用于Java小程序(Applet)和普通应用程序中。它支持的功能包括:用户界面组件;事件处理模型;图形和图像工具;布局管理器,可以进行灵活的窗口布局,这些布局与窗口的尺寸和屏幕分辨率无关;数据传送类,可以通过剪贴板来进行剪切和粘贴。AWT包含在java.awt包中。
组件(Compoment)是一个以图形方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个文本框等,组件必须放在一定的容器(Container)中才可以显示出来。容器是java.awt.Component(所有容器类和组件类的父类)的子类,具有组件的所有性质,其主要功能是容纳其他的组件。
常用的容器有java.awt.Panel、java.awt.Frame和java.applet.Applet。
如果要生成一个窗口,则用Frame类来进行实例化。Frame的外观就像在Windows系统中见到的窗口一样,具有标题、边框、菜单等。Frame对象实例化以后,都是没有大小和不可见的,因此必须调用setSize( )来设置大小,调用setVisible(true)来设置该窗口为可见的。
面板(Panel)是最简单的容器类。应用程序可以将其他组件放在面板提供的空间内,这些组件也包括其他面板。
每个容器都有一个布局管理器(Layout Manager),由布局管理器完成对容器中某个组件的定位或设置其大小尺寸。Java将容器内的所有组件安排给一个“布局管理器”负责管理,如排列顺序,设置组件的大小、位置,当窗口移动或调整大小后组件如何变化等功能授权给对应的容器布局管理器来管理。不同的布局管理器使用不同的算法和策略,容器可以通过选择不同的布局管理器来决定其布局。
FlowLayout 是Panel等容器的默认布局管理器。其组件的放置规律是从上到下、从左到右。
BorderLayout 是Window、Frame和Dialog的默认布局管理器。BorderLayout布局管理器把容器分成5个区域:North、South、East、West和Center,每个区域只能放置一个组件。
GridLayout使容器中各个组件呈网格状布局,并且平均占据容器的空间。
要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制。在事件处理的过程中,主要涉及以下3类对象。
· Event(事件):用户操作在Java语言上的描述,例如键盘操作对应的事件类是KeyEvent。
· Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮Button。
· Event Handler(事件处理者):接收事件对象并对其进行处理的对象。
如果用户用鼠标单击了按钮对象button,则该按钮button就是事件源,而Java运行系统会生成ActionEvent类的对象,该对象中描述了该单击事件发生时的一些信息;然后,事件处理者对象(实现对应事件的Listener接口)将接收由Java运行系统传递过来的事件对象并进行相应的处理。
事件由事件监听器处理。Java提供了抽象的响应特定事件的“事件监听器”,它们在java.awt.event包中被定义为接口,每个组件可以通过调用addXXXListener(XXXListener)方法使某个事件监听器来监听某个事件源。表10-1列出了AWT中的事件及其对应的监听器。
表10-1 AWT中的事件及其对应的监听器
事件名称 |
监 听 器 |
监听器方法 |
方法描述 |
ActionEvent |
ActionListen- |
actionPerformed(ActionEvent e) |
事件引起的执行行为 |
ItemEvent |
ItemListener |
itemStateChanged(ItemEvent e) |
项状态改变时发生的行为 |
MouseEvent |
MouseMotio- nListener |
mouseDragged(MouseEvent e) |
鼠标拖动时发生的行为 |
mouseMoved(MouseEvent e) |
鼠标移动时发生的行为 | ||
mousePressed(MouseEvent e) |
鼠标按键按下时发生的行为 | ||
mouseReleased(MouseEvent e) |
鼠标按键松开时发生的行为 | ||
MouseListe- |
mouseEntered(MouseEvent e) |
鼠标进入时发生的行为 | |
mouseExited(MouseEvent e) |
鼠标离开时发生的行为 | ||
mouseClicked(MouseEvent e) |
鼠标单击时发生的行为 | ||
KeyEvent |
KeyListener |
keyPressed(KeyEvent e) |
键盘按键按下时发生的行为 |
keyReleased(KeyEvent e) |
键盘按键松开时发生的行为 | ||
keyTyped(KeyEvent e) |
敲击键盘按键时发生的行为 | ||
FocusEvent |
FocusListen- |
focusGained(FocusEvent e) |
获得焦点时发生的行为 |
focusLost(FocusEvent e) |
失去焦点时发生的行为 | ||
Adjustment- Event |
Adjustment- |
adjustmentValueChanged(Adjustme- |
滚标状态发生改变时发生的行为 |
Component- Event |
Component- Listener |
componentMoved(ComponentEvent e) |
组件移动时发生的行为 |
componentHidden(ComponentEvent e) |
组件隐藏时发生的行为 | ||
componentResized(ComponentEvente) |
组件尺寸发生变化时发生的行为 | ||
componentShown(ComponentEvent e) |
组件可见时发生的行为 | ||
WindowEvent |
WindowListe- |
windowClosing(WindowEvent e) |
窗口关闭时发生的行为 |
windowOpened(WindowEvent e) |
窗口打开时发生的行为 | ||
windowIconified(WindowEvent e) |
窗口最小化时 | ||
windowDeiconified (WindowEvent e) |
窗口最小化还原时 | ||
windowClosed(WindowEvent e) |
窗口关闭时发生的行为 |
续上表
事件名称 |
监 听 器 |
监听器方法 |
方法描述 |
WindowEvent |
WindowLis- |
windowActivated(WindowEvent e) |
窗口激活时发生的行为 |
windowDeactivated(WindowEvent e) |
窗口不激活时发生的行为 | ||
ContainerEve- |
ContainerLi- |
componentAdded(ContainerEvent e) |
增加组件时发生的行为 |
componentRemoved(ContainerEve- |
移除组件时发生的行为 | ||
TextEvent |
TextListener |
textValueChanged(TextEvent e) |
文本值发生变化时发生的行为 |
用于创建GUI组件的类包含在java.awt软件包中,可以通过下面的语句来引入java.awt软件包中的类:
import java.awt.*;
图10-3(a)列出了java.awt中的各个类;图10-3(b)列出了AWT常用图形组件类的继承关系。
图10-3(a)java.awt中的各个类
图10-3(b)AWT常用图形组件类的继承关系