241

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

在任何情况下,AWT 比摇摆更有用/建议使用,反之亦然?

4

9 回答 9

254

AWT 是操作系统中存在的本机系统 GUI 代码的 Java 接口。尽管它会尝试,但它不会在每个系统上都以相同的方式工作。

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 应用程序可以运行得足够快,可以服务甚至是 zippy,并且与使用本机小部件的应用程序几乎没有区别。有人会说达到这一点花了太长时间,但大多数人会说这是非常值得的。

最后,您可能还想查看 SWT(用于 Eclipse 的 GUI 工具包,是 AWT 和 Swing 的替代品),这在某种程度上回归了 AWT 通过 Java 访问本机小部件的想法。

于 2009-01-03T09:51:31.433 回答
37

大家已经提到的基本区别是,一个是的,一个是的。让我解释一下,重量级这个词的基本含义是,当您使用 awt 组件时,用于获取视图组件的本机代码是由操作系统生成的,这就是为什么它的外观从操作系统到操作系统会发生变化。在摆动组件中,JVM 负责为组件生成视图。我看到的另一个说法是,swing 是基于 MVC 的,而 awt 不是。

于 2009-01-03T10:48:19.540 回答
18

摇摆与 AWT。基本上,AWT 先出现,并且是一组重量级的 UI 组件(意味着它们是操作系统对象的包装器),而 Swing 建立在 AWT 之上,具有一组更丰富的轻量级组件。

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

于 2009-01-03T09:48:58.943 回答
12

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

  • 您可能针对的是不支持 Swing 的旧 JVM 或平台。如果您正在构建 Applets,这曾经真正发挥作用 - 您希望以最低公分母为目标,这样人们就不必安装更新的 Java 插件。我不确定当前安装最广泛的 Java 插件版本是什么——今天可能会有所不同。
  • 有些人更喜欢 AWT 的原生外观,而不是 Swing 的“不完全存在”平台外观。(有比 Swing 的实现更好的 3rd 方原生外观 BTW)很多人更喜欢使用 AWT 的 FileDialog 而不是 Swing 的 FileChooser,因为它提供了大多数人习惯的平台文件对话框,而不是“奇怪的”自定义 Swing 对话框。
于 2009-07-07T02:56:50.523 回答
10

AWT 和 Swing 之间的这种差异导致了几个后果。

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

Swing 组件被称为“轻量级”,因为它们不需要本机 OS 对象来实现其功能。JDialog并且JFrame是重量级的,因为他们确实有同行。因此,像JButton, JTextArea等组件是轻量级的,因为它们没有 OS 对等体。

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

于 2013-05-29T09:35:21.627 回答
8

摇摆:

  1. Swing 是 java 基础类的一部分。
  2. Swing 组件与平台无关。
  3. Swing 组件是轻量级组件,因为 Swing 位于 awt 之上。

AWT:

  1. AWT 被称为抽象窗口工具。
  2. AWT 组件是平台相关的。
  3. AWT 组件是重量级组件。
于 2013-02-21T15:18:57.990 回答
5
  • swing 组件提供了非常灵活的用户界面,因为它遵循模型视图控制器(mvc)。
  • awt 不是基于 mvc 的。
  • 挥杆动作更快。
  • awt 不能更快地工作。
  • 摆动组件重量轻。
  • awt 组件很重。
  • swing占用更少的内存空间。
  • awt 占用更多的内存空间。
  • swing 组件独立于平台。
  • awt 依赖于平台。
  • swing 需要 javax.swing 包。
  • awt 需要 javax.awt 包。
于 2013-01-31T13:51:30.347 回答
3

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

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

于 2013-04-11T13:37:45.203 回答
0

爪哇 8

摇摆

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

AWT - 抽象窗口工具包

  • 平台相关
  • AWT 组件是重量级的
  • package java.awt
于 2020-11-27T13:12:25.383 回答