浅析Swing.SWT和AWT的区别

开发 后端
本文简单介绍Swing.SWT和AWT的区别,SWT和AWT不得不牺牲一些组件和特性以提供一个通用的APIs。

上一篇的比较主要是在API级别上的。让我们将比较的焦点转移到实现细节上。Swing.SWT和AWT的区别是Swing是纯Java实现,而SWT和AWT是Java和JNI的混合。当然,它们的目标都是相同的,提供一个跨平台的APIs。然而为了达到这一点,SWT和AWT不得不牺牲一些组件和特性以提供一个通用的APIs。

Swing.SWT和AWT的区别

AWT

一个AWT组件通常是一个包含了对等体接口类型引用的组件类。这个引用指向本地对等体实现。举java.awt.Label为例,它的对等体接口是 LabelPeer。LabelPeer是平台无关的。在不同平台上,AWT提供不同的对等体类来实现LabelPeer。在Windows上,对等体类是WlabelPeer,它调用JNI来实现label的功能。这些JNI方法用C或C++编写。它们关联一个本地的label,真正的行为都在这里发生。作为整体,AWT组件由AWT组件类和AWT对等体提供了一个全局公用的API给应用程序使用。一个组件类和它的对等体接口是平台无关的。底层的对等体类和JNI代码是平台相关的。

SWT

SWT也使用JNI的方法论来实现。但细节不同于AWT。SWT的拥护者听到人们拿SWT和AWT相提并论可是会很生气的,Steve Northover,SWT之父,就曾为此抱怨过。

没错,它们是不同的。让我们深究SWT的代码。在SWT中,各个平台上唯一相同的部分是组件的接口,是类和方法的定义签名。所有的底层代码都是平台差异的。 SWT为每个平台提供了OS类。这个类用JNI封装了许多本地APIs。SWT组件类通过把这些JNI方法黏合在一起提供一个有意义的功能。

例如,在Windows上,文本域的选择是由一个系统调用处理的。这个系统调用在Windows的OS类中作为一个本地方法实现。所以在Windows平台的Text的setSelection方法中只用到了一个JNI调用。

然而,在motif上,文本域的选择包含两个本地调用。SWT就在motif的OS类中实现了两个调用。所以在motif上组件类需要作两次调用来实现文本的选择。

Swing.SWT和AWT的区别

现在你应该能看出SWT和AWT的***不同了,它们使用了不同的对等体编程方式来消除平台差异。SWT用java代码或有JNI实现的java对等体来黏合系统调用。而AWT把代码包含在对等体中,使情况复杂化了,我个人觉得SWT的方法更加明智。[是否我翻译有问题,因为我并不觉得是这样更明智,SWT 的无则模拟是不必要的,这是使用者才去做的事,SWT作为提供者应该无则C++实现,当然实现的是最核心的高度复用的又或者需要极大性能支持的,毕竟带了动态链接库,索性多放点东西。

Swing

到了Swing这里,一切就变得清晰和直接了。除了顶层容器,Swing的实现不依赖于具体平台。它掌管了所有的控制和资源。Swing所需要的是事件输入来驱动系统,以及承接自顶层AWT容器的图形处理,字体和颜色。普通的Swing组件可以看作是AWT容器的一块逻辑区域。它们并没有注册对等体。所有添加到同一顶层容器的Swing组件共享它的AWT对等体以获取系统资源,如字体,图形处理等。Swing将组件自己的数据结构存储在JVM的空间中。它完全由自己管理画图处理,事件分发和组件布局。

【编辑推荐】

  1. 不同Swing线程的模型设计
  2. AWT和Swing的可访问性
  3. Swing组件也是AWT的一部分
  4. 浅析iData技术与Swing关系
  5. 命令行输入改变Swing程序外观
责任编辑:佚名 来源: IT168技术
相关推荐

2009-07-17 09:36:14

SWT和Swing的区

2009-07-16 13:37:33

Swing和AWT

2009-07-17 15:30:30

JFaceAWT和SWTSwing

2009-07-14 15:01:02

AWT和Swing

2009-07-14 16:02:04

SWT和Swing

2009-07-17 10:25:41

AWT和SwingSWT

2009-07-17 09:55:02

事件监听器SWT和SwingAWT

2009-07-17 09:44:28

Look And Fe布局管理器SWT和Swing

2009-07-15 15:15:42

比较Swing和SWT

2009-07-17 10:11:55

AWT和Swing

2009-07-10 11:07:18

Swing和SWT

2009-07-10 17:20:38

Swing构件AWT构件

2009-07-17 11:13:46

AWT和SwingSwing组件

2009-07-17 09:07:20

2009-07-10 17:03:17

AWT组件Swing组件

2009-07-15 16:39:51

AWT和Swing

2009-07-14 12:58:49

AWT和Swing

2009-07-16 13:50:28

AWT和Swing

2011-04-15 17:33:39

SWINGAWT

2009-07-17 10:01:14

Swing和AWT
点赞
收藏

51CTO技术栈公众号