技术开发 频道

SWT、Swing 或 AWT:哪个更适合您?

  Java Swing 是 Java Foundation Classes(JFC)的一部分,它是试图解决 AWT 缺点的一个尝试。在 Swing 中,Sun 开发了一个经过仔细设计的、灵活而强大的 GUI 工具包。不幸的是,这意味着我们又要花一些时间来学习 Swing 了,对于常见的情况来说,Swing 有些太复杂了。

  Swing 是在 AWT 组件基础上构建的。所有 Swing 组件实际上也是 AWT 的一部分。Swing 使用了 AWT 的事件模型和支持类,例如 Colors、Images 和 Graphics。Swing 组件、布局管理器以及事件总结如下(参见 清单 4、清单 5 和 清单 6)。正如您可以看到的一样,这些组件集比 AWT 提供的组件集更为广泛,与 SWT 组件集相比也毫不逊色。

  清单 4. 基本的 Swing Class 树(全部在 javax.swing 包或其子包中,“*” 表示抽象类)

1 Object
2     *Component
3         Container
4             *JComponent
5                 *AbstractButton
6                     JButton
7                     JMenuItem
8                         JCheckBonMenuItem
9                         JMenu
10                         JRadioButonMenuItem
11                     *JToggleButton
12                         JCheckBox
13                         JRadioButton
14                 Box
15                 Filler
16                 JColorChooser
17                 JComboBox
18                 JDesktopIcon
19                 JFileChooser
20                 JInternalFrame
21                 JLabel
22                 JLayeredPane
23                     JDesktopPane
24                 JList
25                 JMenuBar
26                 JOptionPane
27                 JPanel
28                 JPopupMenu
29                 JProgressBar
30                 JRootPane
31                 JScrollBar
32                 JScrollPane
33                 JSeparator
34                 JSlider
35                 JSplitPane
36                 JTabbedPane
37                 JTable
38                 JTableHeader
39                 *JTextComponent
40                     JEditorPane
41                         FrameEditorPane
42                         JTextPane
43                     JTextArea
44                     JtextField
45                         JPasswordField
46                 JToolBar
47                 JToolTip
48                 JTree
49                 JViewport
50                     ScrollableTabViewport
51             Panel
52                 Applet
53                     JApplet
54             Window
55                 Dialog
56                     JDialog
57                 Frame
58                     JFrame
59                 JWindow
60

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

  清单 5. Swing 提供了以下 LayoutManagers(全部在 javax.swing 包或其子包中,“*” 表示接口)

1 *LayoutManager
2     CenterLayout
3     *LayoutManager2
4         BoxLayout
5         OverlayLayout
6         SpringLayout
7

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

  清单 6. Swing 提供了以下事件(大部分在 javax.swing.events 包及其子包中)

1 Object
2     EventObject
3         AWTEvent
4             AncestorEvent
5             ComponentEvent
6                 InputEvent
7                     KeyEvent
8                         MenuKeyEvent
9                     MouseEvent
10                         MenuDragMouseEvent
11             InternalFrameEvent
12

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

  为了克服在不同主机上行为也会不同的缺点,Swing 将对主机控件的依赖性降至了最低。实际上,Swing 只为诸如窗口和框架之类的顶层 组件使用对等体。大部分组件(JComponent 及其子类)都是使用纯 Java 代码来模拟的。这意味着 Swing 天生就可以在所有主机之间很好地进行移植。因此,Swing 通常看起来并不像是本地程序。实际上,它有很多外观,有些模拟(尽管通常并不精确)不同主机的外观,有些则提供了独特的外观。

  Swing 对基于对等体的组件使用的术语是重量级(heavyweight),对于模拟的组件使用的术语是轻量级(lightweight)。实际上,Swing 可以支持在一个 GUI 中混合使用重量级组件和轻量级组件,例如在一个 JContainer 中混合使用 AWT 和 Swing 控件,但是如果组件产生了重叠,就必须注意绘制这些控件的顺序。

  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 运行时环境。

0
相关文章