有人能解释一下Swing和AWT之间的区别吗?
在什么情况下,使用AWT比使用Swing更有用或更建议,反之亦然?
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 思路。
大家已经提到的基本差异是一个是重量级,而另一个是轻量级。让我解释一下,重量级的意思是当使用awt组件时,用于获取视图组件的本机代码由操作系统生成,这就是为什么它的外观和感觉会从操作系统到操作系统不同。而在Swing组件中,JVM负责生成组件的视图。我看到的另一种说法是Swing是基于MVC的,而AWT则不是。
Swing与AWT的比较。基本上,AWT是首先出现的一组重量级UI组件(意味着它们是操作系统对象的包装器),而Swing在AWT之上构建了一个更丰富的轻量级组件集。
任何严肃的Java UI工作都是在Swing中完成而不是在AWT中进行的,AWT主要用于小应用程序。
关于何时AWT可能比Swing更有用 -
这种差异导致了AWT和Swing的几个不同之处。
AWT是在操作系统之上的一层薄代码,而Swing则大得多。Swing还拥有更加丰富的功能。使用AWT时,你需要自己实现很多东西,而Swing内置了它们。对于GUI密集型工作来说,与Swing相比,AWT感觉非常原始。因为Swing本身实现了GUI功能,而不是依赖于主机操作系统,所以它可以在Java运行的所有平台上提供更丰富的环境。由于不是所有平台都以相同的方式实现相同外观的控件,因此AWT在所有平台上提供相同功能方面更为受限。
Swing组件被称为“轻量级”,因为它们不需要本地操作系统对象来实现其功能。JDialog
和JFrame
是重量级的,因为它们有一个peer。因此,像JButton
、JTextArea
等组件都是轻量级的,因为它们没有操作系统peer。
Peer是操作系统提供的小部件,如按钮对象或输入字段对象。
Swing:
AWT:
AWT 1. AWT占用更多的内存空间 2. AWT是与平台相关的 3. AWT需要javax.awt包
Swing 1. Swing占用更少的内存空间 2. Swing组件是与平台无关的 3. Swing需要javax.swing包
Java 8