Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5405336
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: Java

2008-06-14 00:10:56

 Swing 无法充分利用硬件 GUI 加速器和专用主机 GUI 操作的优点结果是 Swing 应用程序可能比本地 GUI 的程序运行速度都慢。Sun 花费了大量的精力来改进最近版本的 Swing (Java V1.4 和 1.5)的性能,这种缺点正在变得日益微弱。由于 Swing 的设计更加健壮,因此其代码基础也更坚实。这意味着它可以在一台健壮的机器上比 AWT 和 SWT 上运行得更好。

  除了具有更多的组件、布局管理器和事件之外,Swing 还有很多特性使得自己比 AWT 的功能更加强大。下面是更为重要的几个特性:

  模型与视图和控件分离

  对于这个模型中的所有组件(例如按钮、列表、表、树、富文本)来说,模型都是与组件分离的。这样可以根据应用程序的需求来采用模型,并在多个视图之间进行共享。为了方便起见,每个组件类型都提供有默认的模型。

  可编程外观

  每个组件的外观(外表以及如何处理输入事件)都是由一个单独的、可动态替换的实现来进行控制的。这样我们就可以改变基于 Swing 的 GUI 的部分或全部外观。

  呈现器和编辑器

  大部分显示模型内容的组件,例如列表、表和树,都可以处理几乎所有类型的模型元素。这可以通过为每种组件类型和模型类型映射一个渲染器或编辑器来实现。例如,一个具有包含 java.util.Date 值的列的表可以有一些专用的代码来呈现数据值和编辑数据值。每一列都可以有不同的类型。

  可访问性

  创建一个残疾人可以访问的 GUI 是非常重要的。Swing 为实现具有可访问性的 GUI 提供了丰富的基础设施和 API。这种支持是单独的,但是如果主机上具有可访问性支持,那么它们应该集成在一起。

  与 AWT 一样,Swing 可以支持 GUI 组件的自动销毁。Swing 还可以支持 AWT 的自底向上和自顶向下的构建方法。

与 AWT 不同,Swing 组件不是线程安全的,这意味着您需要关心在应用程序中是哪个线程在更新 GUI。如果在使用线程时出现了错误,就可能会出现不可预测的行为,包括用户界面故障。有一些工具可以帮助管理线程的问题。

  与 AWT 类似,Swing 的一个优点是,它也是 Java 技术的一种标准配置。这意味着您不需要自己来安装它了。不幸的是,Swing 已经有了很大的变化,因此它很容易变得依赖于最新版本的 Java 语言所提供的特性,这可能会强制用户更新自己的 Java 运行时环境。

  SWT 概述

  与 AWT 的概念相比,SWT 是一个低级的 GUI 工具包。JFace 是一组用来简化使用 SWT 构建 GUI 的增强组件和工具服务。SWT 的构建者从 AWT 和 Swing 实现中学习了很多经验,他们试图构建一个集二者优点于一体而没有二者的缺点的系统。从很多方面来说,他们已经成功了。

  SWT 也是基于一个对等体实现的,在这一点上它与 AWT 非常类似。它克服了 AWT 所面临的 LCD 的问题,方法如下:定义了一组控件,它们可以用来构建大部分办公应用程序或开发者工具,然后可以按照逐个主机的原则,为特定主机所没有提供的控件创建模拟控件(这与 Swing 类似)。对于大部分现代主机来说,几乎所有的控件都是基于本地对等体的。这意味着基于 SWT 的 GUI 既具有主机外观,又具有主机的性能。这样就避免了使用 AWT 和 Swing 而引起的大部分问题。特定的主机具有一些低级功能控件,因此 SWT 提供了扩充(通常是模拟的)版本(通常使用 “C” 作为名字中的第一个字母),从而可以产生更一致的行为。

  在对等体工作方式上,SWT 与 AWT 不同。在 SWT 中,对等体只是主机控件上的一些封装程序而已。在 AWT 中,对等体可以提供服务来最小化主机之间的差异(就是在这里,AWT 碰到了很多行为不一致的问题)。这意味着 SWT 应用程序实际上就是一个主机应用程序,它必然会全部继承主机的优点和缺点。这还意味着 SWT 不能完全实现 WORE 的目标;它更像是一种 WOTE 解决方案。这就是说,SWT 尽管不如 Swing 那么优秀,但是它在创建可移植解决方案方面是很杰出的。

SWT 部件、布局和事件总结如下(参见 清单 7、清单 8 和 清单 9)。正如您可以看到的一样,这些组件集比 AWT 提供的组件集更为广泛,与 Swing 组件集相比也毫不逊色。

  清单 7. 基本的 SWT Class 树(大部分在 org.ecipse.swt.widgets 或 org.eclipse.swt.custom 包或子包中,“*” 表示抽象类,“!” 表示在 custom 包中,“~” 表示在其他包中)

  Object *Dialog ColorDialog DirectoryDialog FileDialog FontDialog MessageDialog PrintDialog *Widget Menu *Item CoolItem !CTabItem MenuItem TabItem TableColumn TableItem TableTreeItem ToolItem TrayItem TreeColumn TreeItem *Control Button Label ProgressBar Sash Scale Scrollable Composite ~Browser Canvas *~AbstractHyperlink ~Hyperlink ~ImageHyperlink *~ToggleHyperline ~TreeNode ~Twistie AnimatedProgress !CLabel Decorations Shell FormText StyledText TableCursor !CBanner !CCombo Combo CoolBar !CTabFolder ~ExpandableComposite ~Section ~FilteredList ~FilteredTree ~Form Group ~PageBook ProgressIndicator !SashForm !ScrolledComposite TabFolder Table TableTree ToolBar Tray Tree ViewForm List Text Slider

  注意:在另外几个包中还有其他一些 SWT 部件,但是这是基本的部件集。

  与 AWT 和 Swing 布局管理器类似,SWT 也提供了非常丰富的布局部件集。布局系统与嵌套容器一起使用,可以生成所需要的任何布局算法。所有这 3 个 GUI 库也可以支持对部件的定位实现绝对控制。SWT 没有等效的 BorderLayout 部件,这一点非常令人失望。FormLayout 对于创建表单基本输入来说非常好用。我认为 SWT 的布局机制比 AWT/Swing 布局部件集的使用更难学习。

清单 8. SWT 提供了以下布局管理器(大部分在 org.eclipse.swt.layout 和 org.eclipse.swt.custom 包或子包中,“*” 表示接口,“!” 表示在 custom 包中)

  *Layout FillLayout FormLayout GridLayout RowLayout !StackLayout

  注意:在另外几个包中还有其他一些 SWT 布局管理器,很多都是为它们所布局的容器而专门定制的,但是这是基本的布局管理器集。

  与 AWT 和 Swing 事件系统一样,SWT 提供了非常丰富的事件集。尽管这些事件并不能与 AWT/Swing 的事件一一对应(例如 AWT 和 Swing 的按钮都会产生 ActionEvent 事件,而 SWT 的按钮产生的则是 SelectionEvent 事件),但是它们通常都是等价的。

  清单 9. SWT 提供了以下事件(大部分在 org.eclipse.swt.events 包或 org.eclipse.swt.custom 包或其子包中,“*” 表示抽象,“!” 表示在 custom 包中)

  Object EventObject SWTEventObject TypedEvent AimEvent !BidiSegmentEvent ControlEvent !CTabFlolderEvent DisposeEvent DragSourceEvent DragTargetEvent !ExtendedModifyEvent focusEvent HelpEvent KeyEvent TraverseEvent VerifyEvent !LineBackgroundEvent !LineStyleEvent MenuEvent ModifyEvent MouseEvent PaintEvent SelectionEvent TreeEvent ShellEvent !TextChangedEvent !TextChangingEvent

  注意:在另外几个包中还有其他一些 SWT 事件,但是这是基本的事件集。这些是从更通用的事件生成的具体事件。

  很多 Swing 组件,例如 JTable,都有自己的模型。对应的 SWT 控件(例如 Table)则没有;不过它们有自己的条目。条目通常用来限制显示文本或通常很小的图像(例如图标)。为了提供一种类 Swing 的模型接口,SWT 使用了 JFace ContentProviders。这些组件可以在应用程序提供的模型(例如 List 或 Table 使用的 java.util.Array )和用作视图的控件之间充当一个桥梁。为了将任意模型对象格式化成条目,SWT 使用了 JFace LabelProviders,它们可以为任何模型对象生成一个文本或图标格式。这可以对复杂模型对象的混合显示进行限制。其他类似组件,例如 ColorProviders 和 LabelDecorators,可以增强对这些条目的显示。对于 Tables 的特例来说,SWT 提供了 CellEditor,它可以临时将任意 SWT 控件链接到一个 Table 单元格上,从而当作这个单元格的编辑器使用。

SWT 不支持 GUI 控件的自动销毁。这意味着我们必须显式地销毁所创建的任何控件和资源,例如颜色和字体,而不能利用 API 调用来实现这种功能。这种工作从某种程度上来说得到了简化,因为容器控制了其子控件的自动销毁功能。

  使用 SWT 只能自顶向下地构建 GUI。因此,如果没有父容器,子控件也就不存在了;通常父容器都不能在以后任意改变。这种方法不如 AWT/Swing 灵活。控件是在创建时被添加到父容器中的,在销毁时被从父容器中删除的。而且 SWT 对于 style 位的使用只会在构建时进行,这限制了有些 GUI 控件的灵活性。有些风格只是一些提示性的,它们在所有平台上的行为可能并不完全相同。

  与 Swing 类似,SWT 组件也不是线程安全的,这意味着您必须要关心在应用程序中是哪个线程对 GUI 进行了更新。如果在使用线程时发生了错误,就会抛出异常。我认为这比不确定的 Swing 方法要好。有一些工具可以帮助管理线程的问题。

  如果所支持的操作系统提供了可访问性服务,那么 SWT GUI 通常也就具有很好的可访问性。当默认信息不够时,SWT 为程序员提供了一个基本的 API 来指定可访问性信息。

  SWT 提供了一个有限的图形环境。到目前为止,它对于 Java2D 和 Java3D 的支持还不怎么好。Eclipse 使用一个名为 Draw2D 的组件提供了另外一种单独的图形编辑框架(Graphical Editing Framework,GEF),它可以用来创建一些绘图应用程序,例如 UML 建模工具。不幸的是,GEF 难以单独(即在整个 Eclipse 环境之外)使用。

  与 AWT 和 Swing 不同,SWT 和 JFace 并不是 Java 技术的标准配置。它们必须单独进行安装,这可以当作是 Eclipse 安装的一部分,也可以当作是单独的库进行安装。Eclipse 小组已经使它的安装变得非常简单,并且 SWT 可以与 Eclipse 分开单独运行。所需要的 Java 档案文件(JAR)和动态链接库(DLL)以及 UNIX® 和 Macintosh 上使用的类似库可以从 Eclipse Web 站点上单独下载。JFace 库需要您下载所有的 Eclipse 文件,并拷贝所需要的 JAR 文件。在下载所需要的文件之后,我们还需要将这些 JAR 文件放到 Java CLASSPATH 中,并将 DLL 文件放到系统 PATH 中。

特性的比较

  下表对 AWT、SWT 和 Swing 库的很多特性进行了比较,这种比较并没有按照任何特定顺序来进行。尽管没有完全列出所有特性,但是列出了很多最重要的特性。

  功能/角色/外表 AWT Swing SWT(风格)

  显示静态文本 Label JLabel Label, CLabel

  显示多行静态文本 Multiple Labels 具有 HTML 内容的 Multiple JLabels 或 JLabel 具有新行的 Multiple Labels 或 Label

  显示多行格式化静态文本 具有不同字体的 Multiple Labels 具有 HTML 内容的 JLabel 具有不同字体的 Multiple Labels

  单行文本输入 TextField JTextField Text(SWT.SINGLE)

  多行文本输入 TextArea JTextArea Text(SWT.MULTI)

  显示图像 N/A JLabel Label

  显示文本和图像 N/A JLabel CLabel

  提示弹出帮助 N/A 组件的 setToolTip,JToolTip 子类 控件的 setToolTip

  风格化的文本输入 N/A JEditorPane StyledText

  从条目列表中进行选择 List JList List

  简单按下具有文本的按钮 Button JButton Button(SWT.PUSH)

  简单按下具有文本或图像的按钮 N/A JButton Button(SWT.PUSH)

  绘图区域;可能用于定制控件 Canvas JPanel Canvas

  选中/取消复选框 CheckBox JCheckBox Button(SWT.CHECK)

  单选按钮选择 CheckBoxGroup ButtonGroup 和 Menu Group 和 Menu

  从一个下拉列表中选择 Choice JComboBox Combo、CCombo

  输入文本或从下拉列表中选择 N/A JComboBox Combo、CCombo

  可滚动区域 ScrollPane JScrollPane 创建 Scrollable 子类

  顶层窗口 Dialog、Frame、Window JDialog、JFrame、JWindow 具有不同风格的 Shell

通用窗口 Window JWindow Shell

  框架窗口 Frame JFrame Shell(SWT.SHELL_TRIM)

  对话框窗口 Dialog JDialog Shell(SWT.DIALOG_TRIM)

  菜单 Menu JMenu Menu

  MenuItem MenuItem JMenuItem MenuItem

  菜单快捷键 通用击键 与 AWT 相同 依赖于主机的快捷键

  弹出菜单 PopupMenu JPopupMenu Menu(SWT.POPUP)

  菜单条 MenuBar JMenuBar Menu(SWT.BAR)

  显示插入符号 N/A Caret Caret

  Web 浏览器 N/A JTextPane(HTML 3.2) Browser(通过嵌入式浏览器)

  Web 页面中的嵌入式控件 Applet JApplet 主机控件(例如 OLE)

  其他控件的通用容器 Panel JPanel Composite

  其他控件的有边界通用容器 Panel(如果是手工画的) 具有 Border 的 JPanel Composite(SWT.BORDER)

  其他控件的有边界和标题的通用容器 N/A 具有 TitledBorder 的 JPanel Group

  单选按钮(一个被选中) Checkbox JRadioButton Button(SWT.RADIO)

  单选按钮的控件扩充 CheckboxGroup RadioButtonGroup Group

  箭头按钮 N/A 具有图像的 JButton Button(SWT.ARROW)

  支持文本显示方向 通过 ComponentOrientation 与 AWT 相同 很多组件都可以支持这种风格

  焦点切换 Policy 和 Manager 对象 与 AWT 相同 下一个控件

  定制对话框 Dialog 子类 JDialog 子类 Dialog 子类

  访问系统事件 EventQueue 服务 与 AWT 相同 Display 服务(不如 AWT 健壮)

  系统访问对话框 FileDialog JColorChooser、JFileChooser ColorDialog、DirectoryDialog、FileDialog、FontDialog、PrintDialog

  显示简单消息对话框 N/A(必须是 Dialog 子类) JOptionPane 静态方法 具有很多风格的 MessageBox

显示简单提示对话框 N/A(必须是 Dialog 子类) JOptionPane 静态方法 N/A(JFace 中用来实现这种功能的子类)

  布局管理器 BorderLayout、CardLayout、FlowLayout、GridLayout、GridBagLayout AWT 加上 BoxLayout、CenterLayout、SpringLayout FillLayout、FormLayout、GridLayout、RowLayout、StackLayout

  基本的绘图控件 Canvas JPanel Canvas

  基本绘图 Graphics 和 Graphics2D 对象 —— 基本形状和文本,任意 Shapes 和 Strokes、Bezier 以及文件 与 AWT 相同 GC 对象 —— 基本形状和文本

  绘图转换 Affine,合成 与 AWT 相同 N/A

  离屏绘图(Off screen drawing) BufferedImage、drawImage 与 AWT 相同 Image、drawImage

  双缓冲区 手工 自动或手工 除非由主机控件提供,否则就是手工

  打印 PrintJob 和 PrintGraphics 与 AWT 相同 向 Printer 设备绘图

  定制颜色 Color 与 AWT 相同 Color

  定制字体 Font、FontMetrics 与 AWT 相同 Font

  光标选择 Cursor 与 AWT 相同 Cursor

  图像特性 从文件中加载,动态创建,可扩充地编辑 与 AWT 相同 从文件中加载,动态创建,基本编辑

  输入自动化 Robot 与 AWT 相同 N/A

  显示工具条 N/A JToolBar ToolBar、CoolBar

  显示进度条 N/A JProgressBar ProgressBar

  将空间划分成区域 N/A JSplitPane Sash 或 SashForm

  显示一个分标签页的区域 N/A JTabbedPane TabFolder、CTabFolder

  显示制表信息 N/A JTable Table

  格式化表的列 N/A TableColumn TableColumn

  显示层次化信息 N/A JTree Tree

  从一定范围的值中进行选择 N/A JSlider Slider

  从一组离散范围的值中进行选择 N/A JSpinner Scale

  对于基本显示的访问 Toolkit、GraphicsConfiguration、GraphicsDevice 与 AWT 相同 Display

  将条目添加到系统托盘(system tray)中 N/A N/A Tray

  关键:N/A —— 不适用。在很多情况中,这种特性都可以通过创建定制控件或控件容器或利用其他定制编程来实现,不过实现的难度会有所不同。

  结束语

  本文对 Eclipse 的 Standard Windows Toolkit with JFace、Java 的 Swing 和 Abstract Windows Toolkit GUI 工具包进行了比较。通过此处提供的比较,您可以确定在自己的新应用程序中应该使用哪个 GUI 工具包。

  在大部分情况中,决定都是在 Swing 与结合了 JFace 的 SWT 之间进行的。通常来说,每个工具包都非常完整且功能强大,足以构建功能完善的 GUI,但是 Swing 通常要比单独使用 SWT(不使用 JFace 时)更好。Swing 具有内嵌于 Java 技术的优点,是完全可移植的,无可争议地是一种更好的架构。Swing 也具有高级图形应用程序所需要的优点。SWT 具有可以作为本地应用程序实现的优点,这可以提高性能,并利用基于 SWT 的 GUI 来实现本地兼容性。

  如果您只为一种平台来开发系统,那么 SWT 就具有主机兼容性方面的优点,包括与主机特性的集成,例如在 Windows 上对 ActiveX 控件的使用。

阅读(1689) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~