Java Swing概述
Swing具有更丰富而且更加方便的用户界面元素集合,Swing对于底层平台的依赖更少。在Swing中,开发了一个经过仔细设计的、灵活而强大的GUI工具包。
1  什么是Swing
在1995年,Java第一次发布的时候,它包含了一个叫AWT(Abstract Windowing Toolkit)的库,用来构建图形用户界面应用程序。
AWT是一个非常简单的具有有限GUI(Graphics User Interface,即图形用户界面)组件、布局管理器和事件的工具包。最终不幸是,有些经常使用的组件,如表、树、进度条等都不支持。对于需要更多组件类型的应用程序来说,用户需要从头开始创建这些组件,造成开发很大的负担。
由于AWT自身的不足,后来于1997年,在JavaOne大会上提出并在1998年发布了JFC(Java Foundation Classes)中包含了一个新GUI组件,即Swing。
Swing将对主机控件的依赖性降至了最低,只为诸如窗口和框架之类的顶层控件使用对等体。大部分控件(JComponent及其子类)都是使用纯Java代码来模拟的。这意味着Swing就可以在主机之间很好地进行移植。
Swing组件超越了简单的窗口部件,它体现了正不断出现的设计模式以及一些最佳实践。采用Swing,不仅仅得到GUI窗口部件的句柄和它所包含的数据,而是定义一个模型去保存数据,定义一个视图去显示数据,定义一个控制器去响应用户输入。事实上,大部分Swing组件的构建是基于MVC(Model-View-Controller)模式的。MVC使应用程序开发变得更清晰,更易维护和管理。
但是,Swing无法充分利用硬件GUI加速器和专用主机GUI操作等优势,所以在开发的应用程序上,可能比本地GUI的程序运行速度都慢。后来,Sun公司花费大量的精力来改进其性能。
除了具有更多的组件、布局管理器和事件之外,Swing还有很多特性使得自己比AWT的功能更加强大。下面是更为重要的几个特性:
模型与视图和控件分离  对于这个模型(MVC模式)中的所有组件(如按钮、列表、表、树等)来说,模型都是与组件分离的。这样可以根据应用程序的需求来采用模型,并在多个视图之间进行共享。为了方便起见,每个组件类型都提供有默认的模型。
可编程外观  每个组件的外观都是由一个单独的、可动态替换的实现来进行控制。这样就可以改变基于Swing的GUI的部分或全部外观。
呈现器和编辑器  大部分显示模型内容的组件,如列表、表和树都可以处理几乎所有类型的模型元素。这可以通过为每种组件类型和模型类型映射一个渲染器或编辑器来实现。
可访问性  创建一个任何人可以访问的GUI非常重要。Swing为实现具有可访问性的GUI提供了丰富的基础设施和API。
因为,AWT和Swing工具包自身存在一些先天不足造成的难以解决的问题,IBM公司在为Eclipse制定了,从底层类出发,开发了一整套自己的图形库标准窗口,即部件工具集(Standard Widget Toolkit,SWT)。
SWT完全摒弃了AWT和Swing的缺点,并且与AWT和Swing完全独立的,不存在任何依赖
性。SWT是一个低级的GUI工具包,而JFace是一组用来简化使用SWT构建GUI的增强控件和工具。
SWT的功能没有通过任何Java虚拟机来操作,而是直接调用Windows GDI和Shell功能。也就是说,在基于Windows平台的Eclipse中,SWT通过DLL形式的本地库与操作系统交互;而在UNIX/Mac下,SWT可通过GTK运行,如图9-1所示。
图9-1  SWT与操作系统
SWT由JNI(Java Native Interface,Java 本机接口)调用操作系统的内部API,因此运行速度快,能够获得与操作系统的内部应用程序相同的外观。
JFace是一个用户界面工具箱,也是一个易用、功能强大的图形包,它简化了常见的图形用户界面的编程任务。SWT和JFace都是Eclipse 平台上的主要组件。JFace是在SWT的基础上创建的,但JFace并不能完全覆盖SWT的功能,JFace和SWT的关系如图9-2所示。
图9-2  JFace和SWT的关系
由于JFace的功能更强大,使用户专注于实现特定插件的功能,而不必花费精力来处理底层窗口小部件系统,所以做图形界面开发时一般优先选用JFace。本章只围绕Swing来介绍一些简单的GUI设计内容。
2  Swing与JFC关系
JFC(Java Foundation Classes)是一个图形框架(Graphical Framework),依据此框架可建构出具有移植性的Java式GUI图形式界面。
JFC主要是由AWT、Swing以及Java 2D三者所构成,若将这些一同搭配运用,则用Java语言开发成的界面,无论移植到Microsoft Windows、Mac OS X或Linux等各种不同的平台上,都能保有一致性的图像呈现。
如图9-3描述了JFC各个部分之间的相互关系。例如,Java2D、Accessibility、Drag and Drop和Accessibility是AWT和JFC的一部分,但它们不属于Swing。这是因为,这些组件使用了一些本地代码,而Swing却不是这样的。
图9-3  JFC与其他组件之间的关系
3  Swing的类层次结构
AWT采用了与特定平台相关的实现,Swing围绕着JComponent的新组件构建,而JComponent则由AWT的容器类扩展而来。其组织结构如图9-4所示:
图9-4  Swing类库组织结构图
从上图可以看出,Compoent类继承了Object类,Container类继承了Compoent类,依次Swing容器组件直接继承AWT类库中的容器组件类,其他大部分组件都是继承与Jcomponet组件。
Swing类库由许多包组成,通过这些包中的类之间相互协作来完成GUI设计。对这些包的描述如表9-1所示。
表9-1  Swing包
包名称
描述
javax.swing
提供一组“轻量级”组件,尽量让这些组件在所有平台上的工作方式都相同
javax.swing.border
提供围绕Swing组件绘制特殊边框的类和接口
lorchooser
包含供JColorChooser组件使用的类和接口
javax.swing.event
供Swing组件触发的事件使用
javax.swing.filechooser
包含JFileChooser组件使用的类和接口
javax.swing.plaf
提供一个接口和许多抽象类,Swing用它们来提供自己的可插入外观功能
javax.swing.plaf.basic
提供了根据基本外观构建的用户界面对象
javax.swing.table
javaswing和javafx提供用于处理javax.swing.JTable的类和接口
提供支持文档的显示和编辑类。
html
提供支持显示和编辑HTML文件类。
html.parser
提供默认的HTML解析器以及支持类
tf
提供一个RTFEditorKit类,用于创建富文本格式(Rich-Text-Format)的文本编辑器
提供处理javax.swing.JTree的类和接口
javax.swing.undo
允许开发人员为应用程序(例如文本编辑器)中的撤消/恢复提供支持
其中,javax.swing包是Swing提供的最大包,它包含将近100个类和25个接口,几乎所有Swing组件都包含在该包中。
javax.swing.event包中定义了事件和事件类,javax.swing.event包与AWT的event包类似。Java.awt.event和javax.swing.event都包含事件类和接口,它们分别响应由AWT组件和Swing组件激发的事件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。