AWT
AWT 是操作系统 GUI 代码到 Java 的接口。尽管它尝试着在每个系统上都以相同的方式工作,但实际上多少都有所出入;
AWT 是 Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口。AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为 peers。也就是说,当我们利用 AWT 来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库。由于不同操作系统的图形库所提供的功能是不一样的,在一个平台上存在的功能在另外一个平台上则可能不存在。为了实现 Java 语言所宣称的”一次编译,到处运行”的概念,AWT 不得不通过牺牲功能来实现其平台无关性,也就是说,AWT 所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于 AWT 是依靠本地方法来实现其功能的,我们通常把 AWT 控件称为重量级控件;
Swing
Swing 是在 AWT 的基础上构建的一套新的图形界面系统,它提供了 AWT 所能够提供的所有功能,并且用纯粹的 Java 代码对 AWT 的功能进行了大幅度的扩充。例如说并不是所有的操作系统都提供了对树形控件的支持,Swing 利用了 AWT 中所提供的基本作图方法对树形控件进行模拟。由于 Swing 控件是用 100% 的 Java 代码来实现的,因此在一个平台上设计的树形控件可以在其他平台上使用。由于在 Swing 中没有使用本地方法来实现图形功能,我们通常把 Swing 控件称为轻量级控件;
Swing 是一个或多或少的纯 Java GUI。它使用 AWT 创建一个操作系统窗口,然后将按钮,标签,文本,复选框等的图片绘制到该窗口中,并响应所有的鼠标点击,键条目等,自行决定要做什么而不是让操作系统处理它。因此,Swing 是 100%可移植的,跨平台是相同的(尽管它是可换肤的,具有“可插入的外观和感觉”,可以使它看起来像本地窗口和小部件的外观);
二者的不同之处
这些对于 GUI 工具包来说是非常不同的方法,并且会产生很多后果;
AWT 是一个跨平台的接口,因此即使它使用底层操作系统或本地 GUI 工具包来实现其功能,但它不提供访问这些工具包可以执行的所有操作。另一个平台上可能存在的高级或更新的 AWT 小部件可能不受支持。在每个平台上都不相同的小部件的功能可能不受支持,或者更糟糕的是,它们在每个平台上的工作方式可能不同。过去,人们投入大量精力来让他们的 AWT 应用程序跨平台一致地工作 – 例如,他们可能会尝试从 Java 调用本地代码;
由于 AWT 使用本地 GUI 小部件,因此您的操作系统知道它们并将它们放在彼此前面等,而从操作系统的角度来看,Swing 小部件在窗口内是没有意义的像素。Swing 自己处理你的小部件的布局和堆栈。混合 AWT 和 Swing 非常不受支持,并且可能会导致可笑的结果,例如原生按钮会隐藏其所在对话框中的其他所有内容,因为其他所有内容都是使用 Swing 创建的;
由于 Swing 试图在 Java 中尽可能地做所有可能的事情,而不是由本地 GUI 窗口提供的非常原始的图形例程,所以与 AWT 相比,它曾经导致相当大的性能损失。这使得 Swing 不幸地变得缓慢起来。然而,由于更优化的 JVM,更快的机器和(我认为)Swing 内部的优化,这在过去几年中已经大幅缩水。今天,Swing 应用程序可以运行得足够快以至于可以维护,甚至可以很灵活,并且与使用本机小部件的应用程序几乎没有区别。有人会说,要达到这个目标需要很长的时间,但大多数人会说它是非常值得的;
AWT 和 Swing 之间的基本区别:AWT 是基于本地方法的 C/C++程序,其运行速度比较快;Swing 是基于 AWT 的 Java 程序,其运行速度比较慢。对于一个嵌入式应用来说,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛盾的情况下,简单而高效的 AWT 当然成了嵌入式 Java 的第一选择。而在普通的基于 PC 或者是工作站的标准 Java 应用中,硬件资源对应用程序所造成的限制往往不是项目中的关键因素,所以在标准版的 Java 中则提倡使用 Swing,也就是通过牺牲速度来实现应用程序的功能;
最后,您可能还需要查看 SWT(用于 Eclipse 的 GUI 工具包,以及 AWT 和 Swing 的替代方案),这可能会回到 AWT 通过 Java 访问原生 Widgets 的想法;
总结
AWT 是抽象窗口组件工具包,是 Java 最早的用于编写 GUI 程序的开发包;
Swing 是为了解决 AWT 存在的问题而新开发的包,它以 AWT 为基础的;