SWT、Swing、AWT区别AbstractWindowsToolkit(AWT)是最原始的JavaGUI工具包。AWT的主要优点是,它在Java技术的每个版本上都成为了一种标准配置,包括早期的Web浏览器中的Java实现;另外它也非常稳定。这意味着我们不需要单独安装这个工具包,在任何一个Java运行环境中都可以使用它,这一点正是我们所希望的特性。AWT是一个非常简单的具有有限GUI组件、布局管理器和事件的工具包(参见清单1、清单2和清单3)。这是因为Sun公司决定为AWT使用一种最小公分母(LCD)的方法。因此它只会使用为所有Java主机环境定义的GUI组件。最终的结果非常不幸,有些经常使用的组件,例如表、树、进度条等,都不支持。对于需要更多组件类型的应用程序来说,我们需要从头开始创建这些组件。这是一个很大的负担。清单1.基本的AWTClass树(全部在java.awt包中,“*”表示抽象)1Object2CheckboxGroup3*Component4Button5Canvas6CheckBox7Choice8Container9Panel10Applet11ScrollPane12Window13Dialog14Frame15Label16List17TextComponent18TextArea19TextField20MenuComponent21MenuItem22CheckboxMenuItem23Menu24PopupMenu25注意:另外几个包中还有其他一些AWT组件,但是这是基本的组件集。清单2.AWT提供了下面的布局管理器(全部在java.awt包中,“*”表示接口)1*LayoutManager2FlowLayout3GridLayout4*LayoutManager25BorderLayout6CardLayout7GridBagLayout8注意:另外几个包中还有一些AWT布局管理器,很多都是为它们进行布局的容器专门定制的,但是这是基本的布局管理器集。清单3.AWT提供了以下事件(大部分在java.awt.events包中)1Object2EventObject3AWTEvent4ActionEvent5AdjustmentEvent6ComponentEvent7ContainerEvent8FocusEvent9InputEvent10KeyEvent11MouseEvent12MouseWheelEvent13PaintEvent14WindowEvent15HierarchyEvent16InputMethodEvent17InvocationEvent18ItemEvent19TextEvent20注意:其他几个包中还有另外一些AWT事件,但是这是基本的事件集。这些是从更通用的事件生成的具体事件。通常对于AWT来说(也适用于Swing和SWT),每个事件类型都有一个相关的XxxListener接口(XxxAdapter的实现可能为空),其中Xxx是去掉Event后缀的事件名(例如,KeyEvent事件的接口是KeyListener),用来把事件传递给处理程序。应用程序会为自己感兴趣处理的事件的事件源(GUI组件或部件)进行注册。有时监听接口要处理多个事件。AWT的一个很好的特性是它通常可以对GUI组件自动进行销毁。这意味着您几乎不需要对组件进行销毁。一个例外是高级组件,例如对话框和框架。如果您创建了耗费大量主机资源的资源,就需要手动对其进行销毁。AWT组件是“线程安全的(thread-safe)”,这意味着我们不需要关心在应用程序中是哪一个线程对GUI进行了更新。这个特性可以减少很多GUI更新的问题,不过使AWTGUI运行的速度更慢了。AWT让我们可以以自顶向下(top-down)或自底向上(bottom-up)或以任意组合顺序来构建GUI。自顶向下的意思是在创建子组件之前首先创建容器组件;自底向上的意思是在创建容器(或父)组件之前创建子组件。在后一种情况中,组件的存在并不依赖于父容器,其父容器可以随时改变。通常来说,AWTGUI都是不可访问的。系统并没有为AWT程序员提供API来指定可访问性信息。可访问性(accessibility)处理的是残疾人可以怎样使用应用程序的问题。一个应用程序要想有很好的可访问性,必须与运行平台一起,让残疾人可以通过使用适当的辅助技术(提供其他用户接口的工具)来使用这些应用程序。很多政府和企业都有一些强制要求应用程序为实现可访问性而采用的标准。Sun希望Java语言能够成为一种“编写一次就可以随处运行(writeonce,runeverywhere,即WORE)”的环境。这意味着可以在一台机器上开发和测试Java代码(例如在Windows®上),然后不经测试就可以在另外一个Java主机上运行同样的Java代码。对于大部分情况来说,Java技术都可以成功实现这种功能,但是AWT却是一个弱点。由于AWT要依赖于主机GUI的对等体(peer)控件(其中每个AWT组件都有一个并行的主机控件或者对等体)来实现这个GUI,这个GUI的外观和行为(这一点更重要)在不同的主机上会有所不同。这会导致出现“编写一次随处测试(writeonce,testeverywhere,即WOTE)”的情况,这样就远远不能满足我们的要求了。AWT提供了一个丰富的图形环境,尤其是在JavaV1.2及其以后版本中更是如此。通过Graphics2D对象和Java2D、Java3D服务,我们可以创建很多功能强大的图形应用程序,例如画图和制表包;结合使用JavaSound,我们还可以创建非常有竞争力的交互式游戏。JavaSwing是JavaFoundationClasses(JFC)的一部分,它是试图解决AWT缺点的一个尝试。在Swing中,Sun开发了一个经过仔细设计的、灵活而强大的GUI工具包。不幸的是,这意味着我们又要花一些时间来学习Swing了,对于常见的情况来说,Swing有些太复杂了。Swing是在AWT组件基础上构建的。所有Swing组件实际上也是AWT的一部分。Swing使用了AWT的事件模型和支持类,例如Colors、Images和Graphics。Swing组件、布局管理器以及事件总结如下(参见清单4、清单5和清单6)。正如您可以看到的一样,这些组件集比AWT提供的组件集更为广泛,与SWT组件集相比也毫不逊色。清单4.基本的SwingClass树(全部在javax.swing包或其子包中,“*”表示抽象类)1Object2*Component3Container4*JComponent5*AbstractButton6JButton7JMenuItem8JCheckBonMenuItem9JMenu10JRadioButonMenuItem11*JToggleButton12JCheckBox13JRadioButton14Box15Filler16JColorChooser17JComboBox18JDesktopIcon19JFileChooser20JInternalFrame21JLabel22JLayeredPane23JDesktopPane24JList25JMenuBar26JOptionPane27JPanel28JPopupMenu29JProgressBar30JRootPane31JScrollBar32JScrollPane33JSeparator34JSlider35JSplitPane36JTabbedPane37JTable38JTableHeader39*JTextComponent40JEditorPane41FrameEditorPane42JTextPane43JTextArea44JtextField45JPasswordField46JToolBar47JToolTip48JTree49JViewport50ScrollableTabViewport51Panel52Applet53JApplet54Window55Dialog56JDialog57Frame58JFrame59JWindow60注意:在另外几个包中还有其他一些Swing组件,但是这是基本的组件集。清单5.Swing提供了以下LayoutManagers(全部在javax.swing包或其子包中,“*”表示接口)1*LayoutManager2CenterLayout3*LayoutManager24BoxLayout5OverlayLayout6SpringLayout7注意:在另外几个包中还有其他一些Swing布局管理器,很多都是为它们所布局的容器而专门定制的,但是这是基本的布局管理器集。清单6.Swing提供了以下事件(大部分在javax.swing.events包及其子包中)1Object2EventObject3AWTEvent4AncestorEvent5ComponentEvent6InputEvent7KeyEvent8MenuKeyEvent9MouseEvent10MenuDragMouseEvent11InternalFrameEvent12注意:在另外几个包中还有其他一些AWT事件,但是这是基本的事件集。这些是从更通用的事件生成的“高级”事件。为了克服在不同主机上行为也会不同的缺点,Swing将对主机控件的依赖性降至了最低。实际上,Swing只为诸如窗口和框架之类的顶层组件使用对等体。大部分组件(JComponent及其子类)都是使用纯Java代码来模拟的。这意味着Swing天生就可以在所有主机之间很好地进行移植。因此,Swing通常看起来并不像是本地程序。实际上,它有很多外观,有些模拟(尽管通常并不精确)不同主机的外观,有些则提供了独特的外观。Swing对基于对等体的组件使用的术语是重量级(heavyweight),对于模拟的组件使用的术语是轻量级(lightweight)。实际上,Swing可以支持在一个GUI中混合使用重量级组件和轻量级组件,例如在一个JContainer中混合使用AWT和Swing控件,但是如果组件产生了重叠,就必须注意绘制这些控件的顺序。Swing无法充分利用硬件GUI加速器和专用主机GUI操作的优点。结果是Swing应用程序可能比本地GUI的程序运行速度都慢。Sun花费了大量的精力来改进最近版本的Swing(JavaV1.4和1.5)的性能,这种缺点正在变得日益微弱。由于Swing的设计更加健壮,因此其代码基础也更坚实。这意味着它可以在一台健壮的机器上比AWT和SWT上运行得更好。除了具有更多的组件、布局管理器和事件之外,Swing还有很多特性使得自己比AWT的功能更加强大。下面是更为重要的几个特性:模型与视图和控件分离对于这个模型中的所有组件(例如按钮、列表、表、树、富文本)来说,模型都是与组件分离的。这样可以根据应用程序的需求来采用模型,并在多个视图之间进行共享。为了方便起见,每个组件类型都提供有默认的模型。可编程外观每个组件的外观(外表以及如何处理输入事件)都是由一个单独的、可动态替换的实现来进行控制的。这样我们就可以改变基于Swing的GUI的部分或全部外观。呈现器和编辑器大部分显示模型内容的组件,例如列表、表和树,都可以处理几乎所有类型的模型元素。这可以通过为每种组件类型和模型类型映射一个渲染器或编辑器来实现。例如,一个具有包含java.util.Date值的列的表可以有一些专用的代码来呈现数据值和编辑数据值。每一列都可以有不同的类型。可访问性创建一个残疾人可以访问的GUI是非常重要的。Swing为实现具有可访问性的GUI提供了丰富的基础设施和API。这种支持是单独的,但是如果主机上具有可访问性支持,那么它们应该集成在一起。与AWT一样,Swing可以支持GUI组件的自动销毁。Swing还可以支持AWT的自底向上和自顶向下的构建方法。与AWT不同,Swing组件不是线程安全的,这意味着您需要