精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Java>>JAVA编程>>Java图型>>Java图形类库概述

主题:Java图形类库概述
发信人: jephix()
整理人: zombies(2000-01-02 15:44:52), 站内信件
Java图形类库概述 
<<个人电脑>>

  1994年,全球信息网的迅猛发展为Java提供了良好的契机。Java的首次公开
露面始于网页上一个小小的转动着的咖啡杯。这个Java applet的出现打破了Web
站点沉寂的风格,为原本以静态文字和图片为主的互联网世界带来了新的生机和
情趣。经历了几年的发展,Java已经从最初的Web页面修饰工具发展成如今的Int
ernet/Intranet计算平台。Java的应用也已经不仅仅局限于客户端,由于针对服
务器端应用的Java技术的推出,如Servlet、RMI、企业JavaBeans等等,更多的开
发人员开始使用Java开发和部署企业关键任务应用。 

  Java的广泛应用,除可以归因于其强大的跨平台特性、内在的安全机制及其
分布式计算等特性外,Java提供的图形类库也可以说功不可没。Sun公司在其发布
的早期Java版本JDK1.0中就提供了Java图形类库AWT(抽象视窗工具库),用于图
形用户界面的开发。在JDK1.1中AWT又不断地得以改进。此后,为满足商业化应用
对图形用户界面的更高要求,Sun公司与Netscape、IBM公司合作共同开发了新一
代Java图形类库JFC(Java基础类)。 

  本文将介绍Java图形类库的基本概念、结构及编程方法。我们将从AWT入手,
介绍AWT的组件、布局管理及事件处理机制。并以此为基础,介绍JFC的体系结构
及其各个组成部分,其中会详细介绍Swing组件的组件模型及其特性。 

  AWT简介 

  AWT是Java提供的面向对象的图形用户接口框架,可用于生成现代的、鼠标控
制的图形应用接口,这并不是Java本身的创新。但是,用Java设计和实现的GUI无
需修改,就可以在各种软硬件平台上运行,这才是Java极具革命意义的地方。 


  但是,这并不意味着AWT展现给你的是一种全新的GUI风格。如果你已经习惯
了Windows的图形用户界面,或者是Motif的图形用户界面,那么AWT尊重你的这种
习惯。在AWT中,每一个可视化的GUI组件都有一个本地的对等端(native peer)
,负责该组件的显示与外观。所以用AWT构造的Java应用程序,在PC机的Windows
系统上运行将保持Windows的GUI风格,而拿到Sun工作站上运行则将具有Motif图
形用户界面的风格。 

  GUI组件 

  AWT提供了构造图形用户界面所需要的基本GUI组件。这些GUI组件由java.aw
t包中相应的类来表示,并通过它进行访问和使用。java.awt包是java基本包中最
大的一个包,其中定义了所有GUI组件类,以及其他用于构造图形用户界面的类,
如字体类Font,绘图类Graphics和图像类Image等。 

  图1给出了java.awt包中定义的GUI组件类及其类结构图。如图所示,AWT所提
供的GUI组件大致分为三类,即容器组件、基本组件和菜单组件。 

  容器组件 

  所谓容器组件,是指能够包含其他组件的组件。一个设计良好的用户界面应
该是高度结构化的,而不是一些简单GUI组件的无序组合。而容器组件恰恰有助于
实现GUI的结构化。 

  AWT中提供的容器组件有Panel、Window、Frame、Dialog。其中Panel没有具
体的图形表示,但它却是实现GUI结构化的一个至关重要的组件。我们通常用它来
实现GUI基本组件的组合;Frame则定义了一个包含标题条、系统菜单栏、最大化
/最小化按钮及可选菜单条的完整的窗口;而Dialog主要用于实现应用程序与用户
的信息交流。 

  上述的容器组件虽然功能各异,但是它们都有一个共同的特点:即能够包含
其他GUI组件。然而容器组件是如何管理所包含的GUI组件,如何确定这些组件的
位置和大小的呢?这就涉及到AWT中一个很重要的概念—布局管理。采用布局管理
与Java语言的跨平台特性密切相关。因为不同平台显示文字、图形的方式并不相
同,如果显式地指定一个组件的绝对位置和大小,那么它在某一个平台上能够正
常显示,而在其他平台上的显示效果却可能不尽人意。因此,AWT中定义了布局管
理器接口LayoutManager,LayoutManager的实现类可以自动根据运行平台的不同
来布置所有可视化GUI组件。 

  容器组件既可以使用缺省的布局管理器,也可以通过setLayout方法来设置所
需要的布局管理器。一旦确定了布局管理方式,容器组件就可以使用相应的add方
法向其中加入其他GUI组件。 

  布局管理器 

  AWT提供了以下5种标准布局管理方式,即5个LayoutManager的实现类: 

  FlowLayout:流式布局管理是AWT中最简单的一种布局管理方法。顾名思义,
它是以一种流程式的方式,自左向右、自上而下地布置容器中所包含的GUI组件。
开发人员只需调用setLayout方法将容器组件的布局管理方式设置为流式布局管理
,然后调用add(Component comp)方法将组件加入到容器中即可。Panel缺省的
布局管理方式就是FlowLayout。 

  BorderLayout:BorderLayout用类似于地理区域的方式管理GUI组件的布局,
如图2所示, 

  你可以向5个区域中加入相应的GUI组件。BorderLayout是Frame和Dialog的缺
省布局管理方式。与FlowLayout不同的是,如果使用BorderLayout进行布局管理
,那么在加入GUI组件的时候,就需要明确指出加入的位置,例如: 

  setLayout( new BorderLayout() ); 

  add("Center", new Button("Button") ); 

  CardLayout:CardLayout提供了一种基于卡片式的布局管理方式。在AWT应用
中,可以将某一GUI组件加入到一个指定名字的卡片中,例如: 

  setLayout( new CardLayout() ); 

  add("CardName", new Button("Card 1") ); 

  这里,卡片名字是唯一的,可用于引用相应的卡片。一般而言,加入到卡片
中的GUI组件通常是Panel对象,因为Panel对象又可以包含其他GUI组件,并按照
其自身的布局管理方式来管理它们。为便于在一组卡片之间来回切换,CardLayo
ut定义了一系列方法,如first、next、previous、show等。 

  GridLayout:GridLayout提供了一种基于栅格的布局管理方式。栅格的行数
和列数可以在创建GridLayout对象时指定。采用GridLayout进行布局管理,容器
中的每个组件将占据大小完全相同的一个栅格。向栅格中布置GUI组件有两种方法
:一种是使用缺省的布置顺序,即采用add(Component comp)方法按照从左向右、
从上到下的顺序加入GUI组件;二是采用add(Component comp,int index)将组件
加入到指定的栅格中。 

  GridBagLayout:GridBagLayout是建立在GridLayout之上的一种布局管理方
式。较GirdLayout而言,GridBagLayout更复杂,也更灵活,容器中的每一个组件
可以占据一个或多个连续的栅格。GridBagLayout布局管理器是借助于类GridBag
Constraints来限制每个组件所占据的横向和纵向栅格的个数。 

  基本GUI组件 

  基本GUI组件是构成用户界面的基本元素。这些GUI组件不能独立存在和显示
,而必须先将之加到容器组件中。在java.awt包中定义的基本GUI组件类有(如图
1):Button、Canvas、Checkbox、Choice、Label、List、ScrollBar、TextFie
ld和TextArea。 

  从图1可以看出,所有的基本组件类都是Component类的子类。Component类中
定义了所有GUI组件共有的属性和方法。 

  作为Component的子类,所有基本GUI组件类均可以继承Component类中定义的
属性和方法。除此之外,每一个组件类中又都有针对本身应用特点而定义的属性
和方法。 

  菜单组件 

  Java中的菜单组件是一类特殊的组件。同其他GUI组件不同,菜单组件并不是
Component类的子类,而是从MenuComponent类中派生出来的。这也就是说菜单组
件是不能通过add方法加入到容器组件中去的。在AWT中,菜单系统是通过另外一
种联系机制加入到窗口中的,即Frame类的setMenuBar(MenuBar mbar)方法。 

  AWT中定义的菜单组件有四类:MenuBar, Menu, MenuItem和 CheckboxMenuI
tem。MenuBar是窗口的菜单条,其中定义了add方法,用于向菜单条中加入子菜单
Menu和菜单项MenuItem;Menu是子菜单,它可以通过add方法来组合MenuItem和其
他子菜单;而MenuItem则是最基本的菜单项,MenuItem还有一个特殊的实例Chec
kboxMenuItem,主要用来表示菜单项的开关状态。通过AWT定义的这四个菜单组件
,我们可以创建一个完整的菜单系统。 

  AWT事件处理 

  前面简要介绍了AWT提供的GUI组件。那么,是不是有了GUI组件就可以构造一
个应用系统的用户界面呢?答案是否定的,因为这样构造出来的图形用户界面是
无法与用户交互的,一个完整的用户界面系统还必须具备事件处理能力。 

  从JDK1.0到JDK1.1,AWT的事件处理机制有了很大的变化。在JDK1.1中,AWT
采用了一种新的事件处理模型—代理事件模型。较JDK1.0中的事件处理模型而言
,新的事件处理模型不仅更为灵活,而且完全支持JavaBeans。 

  图3给出了AWT的代理事件模型。在这个模型中有如下三个角色: 

  事件源:即产生或发出事件的对象。例如,用户点击了图形用户界面上的一
个按钮,按钮就会产生一个鼠标按下的事件。此时,按钮就是事件源。 

  事件:AWT中定义了各种事件类,如鼠标事件(MouseEvent)和窗口事件(W
indowEvent)等。 

  事件监听器:事件监听器用于监听某类事件的发生。它通过调用事件源中定
义的addxxxListener方法(xxx代表某类事件),来登记所需监听的事件。当该事
件源发出此类事件时,事件监听器就会得到通知。在AWT中,事件监听器是java.
awt.event包中的一类接口,其中定义了被监听的事件发生时,系统要调用的方法
。 

  新一代Java图形类库—JFC 

  AWT提供了构造applet和application图形用户界面的基本类库。通过采用“
本地对等端”(native peer)模型,即AWT中的每一个可视化GUI组件都有一个相
应的本地对等端来负责它的显示与外观,从而解决了跨各种软硬件平台显示GUI的
问题,为Java最初的成功奠定了基础。 

  AWT的“本地对等端”模型,满足了当时开发人员希望Java在不同平台上运行
时,具有本地显示风格的要求,但同时也带来了一些问题: 

  ●“本地对等端”模型给GUI的绘画和事件处理带来了很多限制,使得某些方
面的GUI编程很难实现:如采用透明背景色、改变GUI组件外形为其他形状等。 


  ● AWT提供的是本地显示风格,但是随着Internet的普及,更多的开发人员
希望网络应用能够具有一致的显示风格。 

  为解决AWT的“本地对等端”模型带来的问题,Sun公司与Netscape、IBM合作
共同开发了新一代Java图形类库—JFC(Java Foundation Class)。JFC实际上是
AWT的超集,它提供了更丰富的GUI组件和更强的图形/图像处理能力,而且JFC完
全向下兼容AWT的应用。JFC的发布,使得Java在开发客户端应用方面又向前迈进
了一大步。目前,JFC的版本是JFC1.1,它不但可以作为一个单独的包下载,而且
已经成为JDK1.2的核心部分。 

  与AWT相比,JFC提供了更丰富的GUI组件,即Swing组件。Swing组件全部是“
轻型”组件(即不需要“本地对等端”的组件),具备“可插接的外观和感觉”
特性。此外,JFC还提供了丰富的二维图形/图像支持、系统级的拖放功能和对辅
助技术的支持。下面将分别介绍这四部分特性:Swing、Java 2D、Drag&Drop和 
Java Accessibility。 

  Swing 

  Swing组件集是JFC提供的一套新的GUI工具,它简化了基于图形界面的窗口系
统的开发。Swing组件是所谓的“轻型”(lightweight)组件,因为这些组件同
AWT中的基于本地对等端的组件(我们称之为heavyweight组件)不同,这些组件
没有对应的对等端,也即不需要跟操作系统相关的本地UI代码。因此,实现这些
组件所需要的代码量更少,而且减少了在不同平台上运行可能带来的不一致性。
 

  此外,开发人员使用Swing可以方便地选择自己需要的GUI风格:本地的显示
风格、统一的Java显示风格或用户定制化的显示风格。总之,当你开发客户端应
用时,Swing给你带来了更多的灵活性和更强大的功能。 

  Swing & AWT 

  在图4中,我们给出了Swing和AWT的关系。事实上,Swing是对AWT的扩展,而
并非是Swing替代了AWT。从体系结构的角度来说,Swing构筑在AWT(并非AWT的全
部)之上,如图4所示。Swing位于JFC的一系列API之上,例如Java 2D API、Dra
g&Drop API和Accessibility API。因为这些API都需要依赖于本地代码来执行一
些任务,而Swing的组件是不依赖于本地对等端的。因此,Java 2D API、Drag&D
rop API和Accessibility API都是JFC的组成部分,同时也是AWT的组成部分,但
是它们都不属于Swing。 

  Swing组件介绍 

  Swing提供了一套丰富的“轻型”GUI组件,定义在javax.swing包中。Swing
组件涵盖了AWT中业已提供的GUI组件,这些组件的类名即是AWT的组件类名加上前
缀“J”。此外,为了满足商业化桌面应用的需求,同时简化应用的开发和部署,
Swing还定义了一套新的高层次的GUI组件。其中基本GUI组件新增加了JTable、J
Tree、JSlide、JProgressBar、JToolTip以及JFileChooser和JColorChooser,并
将Choice组件更名为大家熟悉的ComboBox;而容器组件则新增加了JSplitPane、
JTabbedPane、JToolBar、JInternalFrame和JLayeredPane。 

  Swing组件,无论是基本组件还是容器组件,都沿用了AWT(JDK1.1)的事件
处理模型。除了java.awt.event包中定义的事件类和事件监听器接口,Swing还在
javax.swing.event包中为新增加的组件定义了相应的事件类和事件监听器接口。
 

  Swing组件体系结构 

  Swing组件早期采用的体系结构是“模式-视图-控制器”(model-view-co
ntroller),简称为MVC。MVC模型的应用可以追溯至SmallTalk,它是GUI对象常
用的一种结构设计。在MVC模型中,一个可视化应用可以分为以下三个方面: 

  模式:代表应用的数据 

  视图:是应用数据的可视化表示 

  控制器:接受用户在数据视图上的输入,并相应地改变数据模式。 

  在Swing开发小组试图采用MVC作为Swing组件的结构模型过程中,他们发现M
VC的视图和控制器部分密切相关,这种简单将应用切分为上述三部分在实际工作
中效果并不理想。因此,经过Swing开发小组的讨论,他们采用了一种改进的MVC
模型,即“分离模式”模型,如图5所示。在这种结构模型中,模式独立出来,而
视图和控制器则合并成为一个单一的UI对象,来负责Swing组件的外观和感觉(l
ook and feel,简写为LAF)。 

  在这种结构模型中,包括UI管理器、UI对象和模式三部分: 

  UI管理器 

  为了管理Swing组件的显示特性,Swing在javax.swing包中定义了UIManager
类,以跟踪和管理Swing组件当前的和缺省的LAF。目前Swing提供三种GUI显示风
格:Java LAF、Windows LAF和Motif LAF。开发人员可以通过UIManager的setLo
okAndFeel方法,动态地设置Swing应用的显示风格。 

  UI对象/UI代理 

  Swing的每一个组件都有处理其自身的视图和控制器的能力。但是,正如图5
所示,每一个Swing组件类都不直接处理与其显示相关的部分,而是将它代理给当
前安装的LAF模块所提供的UI对象,所以也称之为UI代理。从图5中可以看出UIMa
nager对Swing组件的外观和显示的控制,是通过它与Swing 组件的UI对象的通信
来实现的。UIManager和UI代理与Swing组件的可插接的显示和感觉(Pluggable 
Look and Feel)特性密切相关。 

  模式Model 

  通常我们认为一个设计良好的程序应当是以体系结构为中心的,而不是以用
户界面为中心的。而Swing在设计过程中以及其后的版本更新过程中,始终坚持了
这一点。基于此,对每一个能够存储或操纵数据/值的组件,Swing都定义了一个
单独的Model接口,开发人员既可以使用系统提供的缺省数据模式,也可以实现自
定义的数据模式。 

  在Swing中,Model接口可以分为两类:即GUI状态模式接口和应用-数据模式
接口。前者是定义了GUI组件的可见状态的接口,例如ButtonModel接口中定义了
按钮当前的状态。而对于更复杂的GUI组件,如JTree、JTable等,则定义了应用
-数据模式接口,这类接口用于管理复杂的数据信息。 

  实际上,Swing的“分离模式”模型并未明确区分GUI状态模式接口和应用-
数据模式接口。但是了解这两种模式接口的不同,有利于开发人员根据应用的需
要和组件的特点灵活地进行编程。 

  可插接的外观和感觉 

  可插接的外观和感觉(Pluggable look & Feel,PL&F)是Swing的一部分,
它提供了一种灵活的机制:开发人员既可以选择Java LAF,在不同平台上获得一
致的显示风格,也可以选择依赖于平台的LAF。如果系统提供的LAF仍不满足应用
的需要,开发人员可以利用Swing提供的“可插接的外观和感觉”特性来构造一个
新的、定制化的LAF。 

  PL&F的实现与我们前面提到的UIManager和UI代理密不可分。每一个Swing组
件特定于外观和感觉的部分都代理给相应的UI对象了。Swing在javax.swing.pla
f包中,定义了一套抽象类来代表UI对象,其命名规范是将Swing组件类名的前缀
“J”去掉,再加上后缀“UI”。每一个LAF模块,包括系统安装的和用户自定义
的,都必须提供这些抽象类的实现。通常,UI代理是在Swing组件的构造函数中被
创建,开发人员可以通过Swing组件的setUI/getUI方法来设置/获取之。设置Swi
ng组件的UI代理的过程实际上就是安装组件的LAF的过程。 

  当一个用Swing编写的应用程序被JVM载入的时候,Swing缺省的动作是将组件
的LAF初始化为Java LAF。如果希望采用其他的LAF,只需要调用UIManager中定义
的setLookAndFeel方法即可。UIManager类还定义了各种方法,以方便用户获取有
关LAF的各种信息,如本地系统采用的LAF、当前的和缺省的LAF及系统安装的所有
LAF等。 

  除采用系统提供的LAF外,还可以定义自己需要的LAF。Swing定义了抽象类j
avax.swing.LookAndFeel,它代表了实现一种LAF所需要的全部信息。所有的LAF
都需要继承抽象类LookAndFeel,并实现其中的抽象方法。通常,一个LAF模块(
如javax.swing 

  .plaf.metal)包含LookAndFeel类的子类(如MetalLookAndFeel);所有UI
代理类(例如MetalButtonUI等)和LAF应用类。 

  Java 2D 

  由Sun公司与Adobe系统公司合作推出的Java 2D API,提供了一个功能强大而
且非常灵活的二维图形框架。Java 2D API扩展了java.awt包中定义的Graphics类
和Image类,提供了高性能的二维图形、图像和文字,同时又维持了对现有AWT应
用的兼容。 

  Graphics2D类在Java二维图形功能中起着相当重要的作用,在该类中提供了
各种设置二维绘画属性的方法,从而使一般的开发人员能够像绘画专家一样画出
高品质的二维图形/图像。Graphics2D主要有如下的绘画属性: 

  填充模式:填充模式既可以是一种颜色,也可以是Java 2D中定义的填充模板
,如GradientPaint或TexturePaint。Graphics2D的setPaint方法可用于设置填充
模式。 

  透明度:Java 2D允许在绘画时指定透明度,以使下面的图形能够透过当前绘
制的图形/图像部分地显示出来。Graphics2D的setComposite方法可用于设置绘画
透明度。 

  画线模式:Java 2D允许在绘画时指定线的宽度、是否用虚线以及线与线联接
的模式。这些设置是通过Graphics2D的setStroke方法来实现的。 

  字体:在Java 2D中允许本地字体的使用。通过Graphics2D的setFont方法,
用户可以自由选择所需要的字体。 

  此外,Graphics2D中还定义了各种坐标变换方法,开发人员可以方便地进行
图形/图像的变换和移位。Java 2D API,除了java.awt包中定义的Graphics2D和
相关的绘画类外,还包括java.awt.image包中定义的图像类和java.awt.geom包中
定义的二维图形类。 

  Drag&Drop 

  Java Drag&Drop API定义在java.awt.dnd包中。拖放功能(dnd)是JDK1.2中
新增加的JFC特性。其设计目标是实现与平台无关的拖放操作,包括Java应用之间
的拖放操作和java应用与本地应用(如Win32 OLE、CDE/Motif等)之间的拖放操
作。JFC中拖放功能的实现极大地改善了Java应用与非Java应用之间的互操作性。
 

  为了实现与平台无关的可拖放性,JFC在java.awt.dnd包中定义了一套类和接
口,其中最主要的是DragSource、DropTarget类和DragSourceListener、DropTa
rgetListener、DragGestureListener接口。DragSource、DragSourceListener和
DragGestureListener用于构造可被拖拉的Java组件(拖放源),以及跟踪用户拖
放的动作和状态;而DropTarget和DropTargetListener则用于构造可接受拖放源
的Java组件(拖放目标),以及跟踪拖放的状态。 

  Java Accessibility 

  由于市场的原因,大多数开发商还未意识到“辅助技术”的重要性。广义地
讲,辅助技术是指所有能够帮助残疾人去做力所不能及的事情的技术。常用的辅
助技术有屏幕阅读器、屏幕放大器等。Java Accessibility的设计目标就是使残
疾人有更多的机会获取Web的信息。目前Java Accessibility包括Java Accessib
ility API和Java Accessibility Utility。 

  Java Accessibility API定义在javax. accessibility包中。它定义了构成
Java应用的GUI组件与访问Java应用的辅助技术之间的协定。如果Java应用完全支
持Accessibility API,则该应用就可以与辅助技术(如屏幕阅读器等)兼容。 


  Java Accessibility Utility是Sun公司提供给辅助技术厂商的,以便他们的
产品能够访问Java应用。目前,Java Accessibility Utility作为一个单独的软
件包,可以在javasoft的站点上下载。这个软件包能够支持辅助技术定位和查询
java应用中的GUI对象,并支持这些GUI对象的事件监听器的安装。 

  结束语 

  Java图形类库AWT与JFC是开发客户端Java应用的重要工具。AWT是Java图形类
库的基础,了解AWT,尤其是AWT的事件处理机制和AWT的布局管理,有利于JFC的
学习。作为新一代Java图形类库,JFC提供了一套丰富的GUI组件,其显著特性就
是具备PL&F能力;此外,JFC还包容了Java二维特性、系统级的拖放特性和对辅助
技术的支持。 

  JFC极大地扩展了AWT的能力,它为开发人员创建和部署商业化的Internet/I
ntranet应用提供了一个可扩展的、稳定的开发平台。目前,已有为数众多的可视
化集成开发工具厂商宣布了对JFC的支持,其中包括大家熟悉的JBuilder、Visua
l Cafe、PowerJ以及Visual Age等。利用这些IDE工具,开发人员可以更方便、快
捷地开发和部署JFC应用。

--
love is lighted by impulsion, maintained by emotion and terminated by destiny...
http://bluecafe.virtualave.net

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 203.93.87.180]

[关闭][返回]