我一直在阅读关于AWT vs Swing的一些内容,但我并不清楚Swing是如何工作的。我已经读过Swing位于AWT之上并且它是轻量级的(而不是AWT)。我的问题是“如果它使用AWT并继承AWT容器,它怎么能轻量级?”我很迷惑。为什么不使用SwT而不是AWT呢?为什么不使用AWT呢? AWT会减慢Swing组件的速度吗?
答案 0 :(得分:4)
"如果它使用AWT并继承AWT容器,它怎么可以轻量级?"
轻量级意味着Swing组件没有它自己的本地对等体,它共享一个(公共)本地对等体。这个本地对等体来自它添加到的AWT容器(通常是窗口),并在该容器层次结构中的所有Swing组件之间共享......
AWT提供"重"提升,连接到本机操作系统并提供通过其渲染Swing组件的核心通道。它还提供了大部分原生集成,例如可以由Swing使用的SystemTray
,Desktop
和每像素半透明API
为什么要使用Swing over AWT ....为什么不使用AWT?
这是一个观点问题,但一般来说,AWT被Swing取代,并提供了一个更灵活的图形API,可以从中开发。因为它不依赖于平台本机组件,这意味着您可以自由地开发所需的组件,并且可以在多个平台上运行。
Swing还借用了大部分AWT API,包括事件队列
JTree
和JTable
将是我使用Swing over AWT的第一个参数;)
AWT会减慢Swing组件的速度吗?
不是真的。 AWT已经使用DirectX和OpenGL管道一段时间了,因为它是原生API和Java API之间的翻译层,它通常很擅长它的作用。此外,没有AWT,你就没有Swing ......
答案 1 :(得分:4)
要了解Swing如何轻量级而不是AWT,您需要了解' peer'的概念。对等体是操作系统提供的小部件,例如按钮对象或输入字段对象。
AWT组件通常是一个组件类,它使用对等接口类型保存引用。此参考指向本机对等实现。
谈到Swing,一切都变得清晰直接。除顶级容器外,Swing的实现不依赖于单个平台。它拥有所有控制和资源。 Swing需要的是用于驱动系统的事件输入,以及从顶级AWT容器继承的图形,字体和颜色。普通的Swing组件可以看作是AWT容器上的逻辑区域。
Swing组件被称为"轻量级"因为它们不需要本机OS对象来实现其功能。诸如JButton,JTextArea等Swing组件是轻量级的,因为它们没有OS对等体。很少有Swing组件可能需要OS对等体,并且会产生与AWT类似的性能。