有人可以解释一下 Swing 和 AWT 之间的区别吗?
在任何情况下,AWT 比摇摆更有用/建议使用,反之亦然?
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 访问本机小部件的想法。
大家已经提到的基本区别是,一个是重的,一个是轻的。让我解释一下,重量级这个词的基本含义是,当您使用 awt 组件时,用于获取视图组件的本机代码是由操作系统生成的,这就是为什么它的外观从操作系统到操作系统会发生变化。在摆动组件中,JVM 负责为组件生成视图。我看到的另一个说法是,swing 是基于 MVC 的,而 awt 不是。
摇摆与 AWT。基本上,AWT 先出现,并且是一组重量级的 UI 组件(意味着它们是操作系统对象的包装器),而 Swing 建立在 AWT 之上,具有一组更丰富的轻量级组件。
任何严肃的 Java UI 工作都是在 Swing 而不是 AWT 中完成的,后者主要用于 applet。
至于 AWT 何时可能比 Swing 更有用 -
AWT 和 Swing 之间的这种差异导致了几个后果。
AWT 是操作系统之上的一层薄薄的代码,而 Swing 则要大得多。Swing 还具有非常丰富的功能。使用 AWT,您必须自己实现很多东西,而 Swing 内置了它们。对于 GUI 密集型工作,与 Swing 相比,使用 AWT 感觉非常原始。因为 Swing 自己实现 GUI 功能而不是依赖于主机操作系统,所以它可以在 Java 运行的所有平台上提供更丰富的环境。AWT 在所有平台上提供相同功能方面受到更多限制,因为并非所有平台都以相同的方式实现相同外观的控件。
Swing 组件被称为“轻量级”,因为它们不需要本机 OS 对象来实现其功能。JDialog
并且JFrame
是重量级的,因为他们确实有同行。因此,像JButton
,
JTextArea
等组件是轻量级的,因为它们没有 OS 对等体。
对等点是操作系统提供的小部件,例如按钮对象或输入字段对象。
摇摆:
AWT:
AWT 1。AWT 占用更多的内存空间 2 。AWT 依赖于平台 3 。AWT 需要 javax.awt 包
摆动 1 . Swing 占用更少的内存空间 2 。Swing 组件独立于平台 3 。Swing 需要 javax.swing 包
爪哇 8