Swing和AWT有什么区别?

246

有人能解释一下Swing和AWT之间的区别吗?

在什么情况下,使用AWT比使用Swing更有用或更建议,反之亦然?


相关链接:https://dev59.com/GnA75IYBdhLWcg3w_ej1#2994324 - Betamoo
9个回答

256

AWT是Java接口,用于访问操作系统中本地GUI代码。它在每个系统上的工作方式都不同,尽管它会尝试。

Swing是一个几乎纯Java的GUI。它使用AWT创建操作系统窗口,并在该窗口中绘制按钮、标签、文本、复选框等的图片,并响应您的所有鼠标点击、键盘输入等,决定自己要做什么而不是让操作系统处理。因此,Swing是100%可移植的,并且在各平台上相同(尽管它可皮肤化并具有“可插入外观”功能,使其看起来更像本机窗口和小部件的外观)。

这些是GUI工具包的截然不同的方法,并具有许多后果。对您的问题的完整答案将尝试探索所有这些。:)以下是其中一些:

AWT是跨平台接口,因此即使它使用底层OS或本地GUI工具包进行其功能,也不提供访问那些工具包可以执行的每件事。可能在一个平台上存在的先进或较新的AWT小部件可能不受另一个平台支持。每个平台上不同的小部件特性可能不被支持,或者更糟糕的是,它们在每个平台上的工作方式可能不同。人们过去花费很多精力以使其AWT应用程序在各平台上的工作保持一致-例如,他们可以尝试从Java中调用本机代码。

由于AWT使用本地GUI小部件,因此您的操作系统知道它们并处理将它们放在彼此前面等问题,而Swing小部件对于您的操作系统来说只是无意义的像素。Swing本身处理您小部件的布局和堆叠。混合使用AWT和Swing得到高度不支持,并会导致荒谬的结果,例如原生按钮会使其所在的对话框框遮盖其他所有内容,因为其他所有内容都是用Swing创建的。

因为 Swing 尝试在 Java 中实现除本地 GUI 窗口提供的原始图形例程之外的所有功能,所以与 AWT 相比,它曾经具有相当大的性能损失。这使得 Swing 遗憾地较难普及。然而,在过去几年中,由于更优化的 JVM、更快的计算机和(我推测的)Swing 内部的优化,这种差距已经大大缩小。今天,Swing 应用程序可以运行得足够快,以至于可以使用或者甚至是像使用本地小部件的应用程序一样不易区分。一些人会说这花费了太长时间才达到这一点,但大多数人会认为这是值得的。

最后,您可能还想查看 SWT(用于 Eclipse 的 GUI 工具包,也是 AWT 和 Swing 的替代品),它有点像通过 Java 访问本地小部件的 AWT 思路。


1
嗯...在多个平台上进行了一些相当广泛的Swing开发后,我可以告诉你它在不同平台上非常不同。相似?当然。相同?绝对不是。 - cletus
2
Java 6更新12版将解决重量级/轻量级问题(请参见http://java.dzone.com/news/a-farewell-heavyweightlightwei)。 - Dan Dyer
1
哇,我简直不敢相信他们能够修复它,而且我仍然无法相信轻量级和重量级组件混合在一起会是可取的。但是他们能够修复它真是令人难以置信。 - skiphoppy
1
别管那两个了,看看WPF吧。 :) - Alper
3
这是一篇官方的Java文章,确认了组件混合问题已得到解决:http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html - user193130

37

大家已经提到的基本差异是一个是重量级,而另一个是轻量级。让我解释一下,重量级的意思是当使用awt组件时,用于获取视图组件的本机代码由操作系统生成,这就是为什么它的外观和感觉会从操作系统到操作系统不同。而在Swing组件中,JVM负责生成组件的视图。我看到的另一种说法是Swing是基于MVC的,而AWT则不是。


16
实际上,Swing采用了一种模型-代理(Model-Delegate)的方法,这种方法源于MVC(Model-View-Controller)方法,其中将视图和控制器结合成为代理结构。 - Purushottam

18

Swing与AWT的比较。基本上,AWT是首先出现的一组重量级UI组件(意味着它们是操作系统对象的包装器),而Swing在AWT之上构建了一个更丰富的轻量级组件集。

任何严肃的Java UI工作都是在Swing中完成而不是在AWT中进行的,AWT主要用于小应用程序。


2
有没有一些情况下,AWT比Swing更有用/建议使用? - Samiksha
3
过去10年前,这个问题曾经是相关的。 - bart
@Pacerier 他在谈论AWT,而不是SWT。 - user1881400
不间断文章链接 https://edn.embarcadero.com/article/26970 - jkmartindale

12

关于何时AWT可能比Swing更有用 -

  • 您可能正在针对不支持Swing的较旧JVM或平台进行开发。如果您正在构建Applets,则需考虑这一点 - 您需要针对最低公共分母进行开发,以便人们无需安装更新的Java插件。我不确定当前最广泛安装的Java插件版本是什么 - 今天可能已经有所不同。
  • 有些人更喜欢AWT的本机外观而不是Swing的“近乎完美”的平台外观。(顺便说一句,有比Swing实现更好的第三方本机外观)很多人喜欢使用AWT的FileDialog而不是Swing的FileChooser,因为它提供了大多数人习惯的平台文件对话框,而不是“奇怪”的自定义Swing文件对话框。

2
但是对于最后一个,我们也可以创建一个文件选择器,它看起来非常像Windows文件对话框(但没有自动完成)。https://dev59.com/o3TYa4cB1Zd3GeqPuWvv - JavaTechnical

10

这种差异导致了AWT和Swing的几个不同之处。

AWT是在操作系统之上的一层薄代码,而Swing则大得多。Swing还拥有更加丰富的功能。使用AWT时,你需要自己实现很多东西,而Swing内置了它们。对于GUI密集型工作来说,与Swing相比,AWT感觉非常原始。因为Swing本身实现了GUI功能,而不是依赖于主机操作系统,所以它可以在Java运行的所有平台上提供更丰富的环境。由于不是所有平台都以相同的方式实现相同外观的控件,因此AWT在所有平台上提供相同功能方面更为受限。

Swing组件被称为“轻量级”,因为它们不需要本地操作系统对象来实现其功能。JDialogJFrame是重量级的,因为它们有一个peer。因此,像JButtonJTextArea等组件都是轻量级的,因为它们没有操作系统peer。

Peer是操作系统提供的小部件,如按钮对象或输入字段对象。


8

Swing:

  1. Swing是Java基础类库的一部分。
  2. Swing组件是跨平台的。
  3. Swing组件是轻量级组件,因为Swing位于AWT之上。

AWT:

  1. AWT被称为抽象窗口工具。
  2. AWT组件是平台相关的。
  3. AWT组件是重量级组件。

5
  • Swing组件提供了更灵活的用户界面,因为它遵循模型视图控制器(MVC)。
  • AWT不是基于MVC的。
  • Swing工作速度更快。
  • AWT工作速度不够快。
  • Swing组件是轻量级的。
  • AWT组件是重量级的。
  • Swing占用更少的内存空间。
  • AWT占用更多的内存空间。
  • Swing组件是跨平台的。
  • AWT是平台相关的。
  • Swing需要javax.swing包。
  • AWT需要javax.awt包。

10
我认为Swing不比AWT更快,因为AWT使用操作系统中已经存在的本地代码(GUI代码),而Swing需要从头构建每个组件。因此,AWT可能更快。您能告诉我您认为Swing更快的观点吗?谢谢。 - JavaTechnical

3

AWT 1. AWT占用更多的内存空间 2. AWT是与平台相关的 3. AWT需要javax.awt包

Swing 1. Swing占用更少的内存空间 2. Swing组件是与平台无关的 3. Swing需要javax.swing包


1
你能告诉我AWT是如何占用更多内存空间的吗?因为它使用本地代码吗? - JavaTechnical
awt需要java.awt.*。 - abhisekp

0

Java 8

Swing

  • 它是Java基础类库的一部分
  • Swing建立在AWT之上
  • Swing组件轻量级
  • Swing支持可插拔的外观和感觉
  • 跨平台
  • 使用MVC:模型-视图-控制器架构
  • 包:javax.swing
  • 与Swing的其他组件不同,顶层容器是重量级的。

AWT - 抽象窗口工具包

  • 平台相关
  • AWT组件是重量级的
  • 包java.awt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接