JFC:Java
时间:2010-09-12 来源:sunliming
中国计算机报1999年第20期
潘逸群
1998年12月,Sun公司正式发布了Java 2 平台(JDK1.2)。与JDK1.1相比,作为Java 2平台核心API的一部分的JFC(Java Foundation Classes)成为其最重要的新特征之一。
自从Java问世以来,就以其“编写一次,到处运行”的特性风靡全球。广大Web页面的开发人员采用Java语言编写Applet从而使他们的页面变得活泼可爱。运用Java技术开发的应用程序免去了开发人员的移植之苦,而AWT(Abstract Windows Toolkit,自JDK1.0以来的核心API之一)在开发现代应用所不可或缺的GUI过程中起到了关键的作用。
AWT的作用和技术上的先进性是不可否认的。它采用了一个抽象的层次使GUI达到了跨平台的目的,但是在某些方面仍然受到了开发人员和用户的抱怨。他们觉得AWT提供的GUI组件太有限而且比较粗糙,在开发大型的应用时不能满足要求,同时效率比较低。另外,采用AWT开发的GUI是基于本地窗口系统的,其表现形式与本地操作系统相关。虽然这符合目前大多数用户的习惯,但正有越来越多的用户希望他们的应用在所有的平台上有完全一致的表现形式。除此之外,在JFC出现以前,JDK并没有提供强有力的图形开发工具包,给图形领域的开发人员采用Java 技术带来了一定的障碍。
基于这些情况,Sun公司联合Adobe、Netscape和IBM等业界领先公司共同开发了JFC。
JFC 概述
JFC 包括四部分的内容:
1. Swing 组件
用于构筑丰富美观的图形用户界面(GUI)的强有力工具。除了AWT中所有的组件均能在Swing中找到对等体并有很大的改进以外,还提供了许多高层次的组件,比如JTable, JList, JTree 等以提高GUI的开发效率。另外在Swing中还采用了一种全新的设计模式(MVC)。
2. Java 2D API
为了弥补原有AWT包中图形能力的不足,Sun公司和Adobe公司共同开发了Java 2D API。Java 2D API 提供了图形、图像、文字三位一体的处理模式和与设备无关的图形图像能力,满足用户“所见即所得”的处理需求。
3. Drag and Drop(D&D)
Drag and Drop API使用户能够在两个应用程序之间实现与平台无关的拖放功能,也就是说拖放可以在两个Java应用程序之间进行,也可以在一个Java应用程序和一个非Java应用程序之间进行。这对于目前的大部分企业仍然保留有大量的非Java应用程序(Native Application)的实际情况具有重要意义,同时可以促进这些企业采用Java技术的进程。用户用Java技术写的应用程序能够很方便地被拖放到他们现有的Windows或Unix应用程序中,最大限度地保护了用户的投资。
4. Accessibility
当前,越来越多的软件开发人员认识到在他们的应用程序中提供对残疾人士的支持的重要性,以使残疾人士能够方便地使用他们的产品。Accessibility API 和基于这些API的一系列实用程序(Accessibility Utilities)提供的正是这些称为“辅助技术(Assistive Technology)”的手段。应用Accessibility API,开发人员可以开发出同时满足正常人和残疾人同时使用的应用软件。JFC Accessibility API 所提供的两个最重要的功能是“屏幕读取器(Screen Reader)”和“屏幕放大器(Screen Magnifier)”。屏幕读取器能够将普通的GUI组件所表示的信息转化成语音信息或通过“盲人终端(Braille Terminal,辅助技术的一种)”表示出来,加上语音识别功能,盲人就能通过Braille Terminal或语音输入来使用计算机和应用软件;而屏幕放大器使用户能够在原有屏幕尺寸的1到16倍之间调整屏幕大小,且应用程序仍然能够不受影响地跟踪事件和屏幕的内容,在屏幕放大过程中字体轮廓的光滑和显示内容的加亮显示也将同步完成以创造出完美的显示图像。
JFC 技术要点
下面对JFC的两个主要的组成部分: Swing Framework 和Java 2D API 的技术要点作一个简要的介绍。
1. Swing Framework 的技术要点
1.1 MVC Design Pattern和Lightweight UI Framework与AWT相比,Swing Framework中采用了一种全新的设计模式:Model(M)-Viewer(V)-Controller(C),简称MVC。MVC是由SmallTalk提出的一种设计GUI的新模式,其基本思想是将一个GUI组件分成三个部分:逻辑描述部分(Model),用于描述该组件的逻辑状态和对这些状态信息的基本操作,可以将之简单地理解为该组件的数据部分和对这些数据的一些简单的操作;图形显示部分(Viewer),即我们最终在屏幕上看到的表现形式;控制部分(Controller),用于描述Model如何对用户的动作作出反应。在MVC模式中,处于核心地位的是Model,它最终控制Viewer的表现结果。采用MVC模式的好处在于有利于GUI组件的层次结构变得更清晰,而且同一个Model可以对应有多个不同的表现形式(Viewer)。在Swing Framework当中即采用了这种设计模式,每一个Swing组件都有M、V、C三个组成部分。由于一个Model可以对应于多个Viewer,每一个组件都可以有多个表现形式。同时Swing完全不同于AWT。AWT需要一个与系统相关的Peer类来最终实现,而Swing采用的是与系统无关的Lightweight UI Framework。用户可以根据自己的实际需要任意定制组件的Viewer。下图简单反映了二者的不同:
1.2 Plugable Look_and_Feel(L&F)
利用L&F,采用Swing组件开发的GUI应用能够动态地改变图形用户界面的表现特征。你可以根据自己的习惯在Windows界面、Motif界面、Mac界面之间动态地切换,也可以定义一套自己专用的表现形式加入到你的GUI应用当中。
由于M、V、C三者分离的特性,对于每一个组件都可以为之定义多个Viewer ( Model只有一个),然后将所有组件的符合Windows表现特征的Viewer集中起来组成一个集合,符合Motif表现特征的Viewer集中起来组成另一个集合。这样每一个组件都有一个表现库,运用JFC中类UIManager的方法,SetUI就可在不同的表现库之间实现动态的切换。Java 2平台发布的JFC实现了Windows、Motif、Mac、Metal等几种L&F, 其中Metal L&F是JFC缺省的,与平台无关的表现形式,在任何平台上都有完全一致的图形用户界面。用户也可以定义一套自己的L&F库。
1.3 JavaBeans Compliant
所有的Swing组件都符合Java组件模型——JavaBeans规范。这使得它们能够被很容易地发布到支持JavaBeans规范的IDE开发工具中,并以可视的方式用鼠标构造用户界面。JBuilder2, Symantic Cafe等开发工具都已支持Swing。
1.4 Delegation Event Model
与AWT1.0层层传递的事件处理机制不同,Swing采用一种被称为Delegation的事件处理模式(从AWT1.1开始就支持这种模式)。Delegation Event Model以Callback为基本特征,在一个完整的事件处理过程中存在两个角色:激发事件的称为“事件源(Event Source)”,对这一事件作出反应的称为“事件监听者(Event Listener)”。任何对某事件感兴趣的Event Listener都必须到Event Source登记。一旦事件发生,Event Source将把该事件直接传递给所有的Event Listener,调用相应的方法进行处理。与层层传递的方式相比,Delegation Event Model具有更高的效率和可扩充性;更为重要的是这种模式尤为适用于大型的企业分布式应用。
1.5 100%纯Java
Swing(实际上是所有的JFC API)是完全的100%纯Java产品,不依赖于任何的本地代码。采用Swing编写的应用具有100%的可移植性,不需要改动任何的代码即可运行于所有的平台。
1.6 High Level Component
除了AWT组件的对等体外(当然在JFC中这些组件都有了很大的优化),Swing还提供了许多高层次的复杂组件,如JList、JTree、JTable、JTextComponent、JTabbedPane、JInternalFrame等,极大地提高了开发人员的工作效率。
2. Java 2D API的技术概述
2.1 图形、图像、文字三位一体的处理方式
Java 2D API提供了一组与设备和分辨率无关的Java图形处理API,而且采用了图形、图像、文字三位一体的处理方式。无论是图形、图像还是文字,最终的实现(比如在屏幕上显示或打印)都是通过抽象出其外围轮廓,然后进行填充这种模式(Imaging Model)完成。
这种处理方式带来了JFC强大的文字处理特征。运用Java 2D API,人们可以任意对字符进行缩放、旋转、裁减、叠盖等处理,就像对图形图像的操作一样。
2.2 用户坐标系支持
Java 2D API 提供对两种坐标系的支持:设备坐标系(JDK1.0支持该坐标系)和用户坐标系(Java 2 平台新增坐标系)。用户坐标系是一种与设备无关的坐标系统,使用户很容易就能获得“所见即所得”的打印效果。Java 2平台对这两种坐标系的支持相对于用户而言是完全透明的,Java 2D系统本身将随着显示目标的不同(屏幕、打印机或其它显示设备)而自动在两种坐标系之间进行转换。
2.3 丰富的显示特性
Java 2D API提供了非常丰富的显示特性。Java 2D API可以画任意宽度的线划,可以选择多种线划模式(实线、虚线、点线等以及线划端点的形状和线划的连接方式都有多种选择);可以定义和选择图形的填充模式,包括填充颜色和图案;有专门的类进行图形的仿射变换操作;支持多个图形之间的“布尔操作(Boolean Operation)”以在原有对象的基础上构造新的图形对象;多个不同颜色的图形对象相互叠加时,其叠加部分可以二者的混合颜色进行显示;除了规则的多边形以外,Java 2D API还可以画不规则的多边形并进行填充……
2.4 图像处理增强
Java 2D API中提供了一些比较高层的类,可直接或间接的用于专业图像处理,包括AffineTransformOp、BandCombineOp、ColorConvertOp、RescaleOp、ConvolveOp等,开发人员能够快速地开发一些图像处理应用,诸如仿射变换、阈值处理、颜色转换、比例缩放等。
2.5 打印
Java 2D API中有一个专门的包 java.awt.print提供了新的打印功能,用于满足用户的打印需求。同老的打印模式不同,Java 2D的打印模式是以callback为基础的,应用程序将打印请求发送给打印机并告知需要打印的内容,然后由打印机决定何时进行打印并要求应用程序该打印内容(callback)。当打印机的缓冲区小于某一页的数据量时,这种打印模式会要求应用程序分若干次解析该打印页(每次只处理该页的若干分之一),分数次完成该页的打印;如果该打印机的打印顺序是从后往前打印,打印系统也会要求应用程序从后往前解析所有的打印内容以保证最终结果的正确性;Java 2D还可以在一个打印请求内为每一页定义不同的打印格式。同时,由于Java 2D透明地支持用户坐标系和设备坐标系,用户能轻易地获得“所见即所得”的打印结果。
小结
JFC是Java客户端技术的一次飞跃,也是Java 2平台最引人瞩目的特征之一。Swing提供了丰富美观的GUI组件和开放的框架; Java 2D API不但本身具有强大的图形能力,还是Java 2平台中许多其它API,如Java 3D、Java Advanced Image API等的基础。运用JFC,开发商开发出的商业应用软件将以全新的面目展现在人们的面前。