Swing和AWT有什么区别?


Answers:


235

AWT是OS中存在的本机系统GUI代码的Java接口。尽管它会尝试,但在每个系统上都无法正常工作。

Swing或多或少是纯Java GUI。它使用AWT创建一个操作系统窗口,然后在该窗口中绘制按钮,标签,文本,复选框等的图片,并响应您的所有鼠标单击,键输入等,从而自行决定要做什么。而不是让操作系统来处理它。因此,Swing是100%可移植的,并且在各个平台上都是相同的(尽管它是可换肤的,并且具有“可插入的外观”,可以使它看起来或多或少类似于本机窗口和小部件的外观)。

这些是GUI工具包的截然不同的方法,并且会带来很多后果。完整回答您的问题将尝试探索所有这些问题。:)这是一对:

AWT是一个跨平台的界面,因此,即使它使用底层操作系统或本机GUI工具包来实现其功能,它也无法提供对这些工具包可以执行的所有操作的访问。一个平台上可能存在的高级或更新的AWT窗口小部件可能在另一平台上不受支持。每个平台上不同的小部件功能可能不受支持,或者更糟的是,它们在每个平台上的工作方式可能不同。人们过去花了很多精力来使他们的AWT应用程序在各个平台上都能一致地工作-例如,他们可能尝试从Java调用本机代码。

由于AWT使用本机GUI小部件,因此您的OS知道它们并进行处理,以此类推,而从操作系统的角度来看,Swing小部件是窗口内无意义的像素。Swing本身可以处理小部件的布局和堆叠。高度不支持将AWT和Swing混合使用,并且可能导致荒谬的结果,例如本机按钮会使它们所在的对话框中的其他内容模糊不清,因为其他所有内容都是使用Swing创建的。

因为Swing试图用Java来做所有可能的事情,而不是由本机GUI窗口提供的非常原始的图形例程,所以与AWT相比,它通常会导致性能下降。不幸的是,这使得Swing赶上了缓慢。但是,由于更优化的JVM,更快的机器以及(我认为)Swing内部的优化,在过去的几年中,这种情况已大大减少。如今,Swing应用程序可以足够快地运行,以使其易于维护甚至是zippy,并且与使用本机小部件的应用程序几乎没有区别。有人会说到现在为止花了太长时间,但大多数人会说这是值得的。

最后,您可能还想看看SWT(用于Eclipse的GUI工具包,是AWT和Swing的替代品),这有点像是通过Java访问AWT的想法。


嗯...在多个平台上做了相当广泛的Swing,我可以告诉你,跨平台的情况大不相同。类似?当然。相同?没门。
cletus

1
重量级/重量级问题将在Java 6 Update 12中消失(请参阅java.dzone.com/news/a-farewell-heavyweightlightwei)。
丹·代尔

哇。我不敢相信他们可以修复它,而且我仍然不相信将轻量级组件和重量级组件混合在一起是不可取的。但是他们可以解决这个问题令人难以置信。
skiphoppy

只是忘了两者。看看WPF。:)
Alper Ozcetin 09年

3
这里有一个官方Java文章证实了混合是固定的:oracle.com/technetwork/articles/java/...
user193130

35

大家都已经提到的基本区别是一个是重量重,另一个是重量轻。让我解释一下,基本上,“重量级”一词的含义是,当您使用awt组件时,用于获取视图组件的本机代码是由操作系统生成的,这就是为什么它的外观在操作系统之间变化的原因与挥杆组件一样,JVM负责为组件生成视图。我看到的另一种说法是swing是基于MVC的,而awt不是。


14
实际上,Swing使用的是Model-Delegate方法,该方法是从MVC方法派生而来的,其中在View和Controller中组合使用Delegate结构
Purushottam,2012年

15

Swing vs AWT。基本上,首先是AWT,它是一组重量级的UI组件(意味着它们是操作系统对象的包装器),而Swing构建在AWT之上,具有一组更丰富的轻量级组件。

任何重要的Java UI工作都是在Swing中完成的,而不是AWT,后者主要用于applet。


1
有没有在某些情况下awt更有用/建议使用然后摆动?
Samiksha,2009年

1
十年前曾经很重要。
巴特

@Pacerier,他谈论的是AWT,而不是SWT

11

至于AWT可能比Swing更有用-

  • 您可能针对的是不支持Swing的旧版JVM或平台。如果您要构建Applet,这实际上起了作用-您希望定位最低的公分母,这样人们就不必安装新的Java插件。我不确定Java插件当前安装最广泛的版本是什么-今天可能有所不同。
  • 有些人更喜欢AWT的本机外观,而不是Swing的“不完全”平台外观。(比起Swing的实现,有更好的第三方显示外观)许多人更喜欢使用AWT的FileDialog而不是Swing的FileChooser,因为它给了大多数人习惯的平台文件对话框,而不是“怪异”的自定义Swing对话框。

2
但是对于最后一个,我们还可以创建一个类似于Windows文件对话框(但没有自动完成)的FileChooser stackoverflow.com/q/17630055/2534090
JavaTechnical 2014年

9

AWT和Swing之间的这种差异会导致多种后果。

AWT是操作系统之上的一薄层代码,而Swing则大得多。Swing还具有非常丰富的功能。使用AWT,您必须自己实现很多事情,而Swing是内置的。对于GUI密集型工作,与Swing相比,AWT感觉非常原始。由于Swing本身实现GUI功能而不是依赖主机OS,因此它可以在Java运行的所有平台上提供更丰富的环境。AWT在所有平台上提供相同功能的局限性更大,因为并非所有平台都以相同方式实现外观相同的控件。

Swing组件被称为“轻量级”,因为它们不需要本机OS对象即可实现其功能。JDialog并且JFrame是重量级的,因为他们确实有同龄人。所以组件喜欢JButtonJTextArea等等,都是轻量级的,因为他们没有一个操作系统等。

对等是由操作系统,提供诸如按钮对象或记录域对象的小部件。


7

摇摆:

  1. Swing是Java基础类的一部分。
  2. Swing组件与平台无关。
  3. 摇摆组件是轻型组件,因为摇摆位于awt的顶部。

AWT:

  1. AWT被称为抽象窗口工具。
  2. AWT组件取决于平台。
  3. AWT组件是重量级组件。

5
  • swing组件遵循模型视图控制器(mvc),因此提供了许多灵活的用户界面。
  • awt不是基于mvc的。
  • 挥杆动作更快。
  • awt不能更快地工作。
  • 秋千组件重量轻。
  • awt组件很重。
  • Swing占用较少的内存空间。
  • awt占用更多的内存空间。
  • Swing组件与平台无关。
  • awt与平台有关。
  • swing需要javax.swing包。
  • awt需要javax.awt包。

10
我不认为swing比AWT更快地工作,因为AWT使用的是操作系统中已经存在的本机代码(gui代码),但是swing从头开始构建每个组件。因此,AWT可能会更快。您能说说挥杆动作更快的观点是什么?谢谢。
JavaTechnical

3

AWT 1。AWT占用更多的存储空间2。AWT依赖于平台3。AWT需要javax.awt包

摇摆 1。摆动占用较少的存储空间2。摆动组件是独立于平台的3。Swing需要javax.swing包


1
您能告诉我AWT如何占用更多的内存空间吗?因为它使用本机代码?
JavaTechnical 2014年

awt需要java.awt。*
abhisekp 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.