社区
Java SE
帖子详情
写JAVA桌面应用程序,用SWT还是用SWING?
国强余富
2010-12-29 03:04:22
如题:写JAVA桌面应用程序,用SWT还是用SWING?到底哪个更好?
...全文
4916
23
打赏
收藏
写JAVA桌面应用程序,用SWT还是用SWING?
如题:写JAVA桌面应用程序,用SWT还是用SWING?到底哪个更好?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
23 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sunyiz
2010-12-30
打赏
举报
回复
[Quote=引用 16 楼 woshigaoshou980 的回复:]
swt速度快,开发起来麻烦,没有规范的帮助,支持的平台有限
swing就很慢了。
swt比起swing真是一个天上一个地下啊!swing是难学难用,难编码,速度慢,界面奇丑无比。前段时间我还用的是wsad的gui设计器写swing程序,那叫一个麻烦--你仅仅要实现把按钮放在视窗底部,就要动用好几个嵌套的jpanel和layout!这还是在设计器的帮助下,如果你想手动编swing我劝你还是打……
[/Quote]
你这个速度“很慢”是哪个年代的事情了
在jdk1.5之后经过对Graphics2D的优化
性能早就过关了
sunyiz
2010-12-30
打赏
举报
回复
[Quote=引用 15 楼 py330316117 的回复:]
swing是基于swt开发的,我们编程有个习惯,就是用上层的不用下层的,所以swing不错,不过swing也有一些swt有的她没有的(比如2d编程)。
[/Quote]
这是哪个人告诉你的……
swing和swt什么时候有这种不可告人的关系了
你要是说swt是参考awt和Swing开发的还靠谱一点点
Swing是基于awt开发的……
希望对你有帮助
2010-12-30
打赏
举报
回复
gui 应用程序是软件的一种主要类型,所以java的gui库应该是标准化并被集成到jre平台中的。然而不同的操作系统有不同的gui风格和组件集。有一些组件在所以平台上有相似的观感。这些共有组件如按钮,标签,文本域,单选框等被称为标准组件。不同的gui工具集提供了不同的组件集。gui工具集总是遵循不同的原则来选择组件类型和特征以实现。考察一个工具集,有两个不同的要素:组件类型和组件特征。
terms
首先让我图解两个数学概念:最大公约数和最小公倍数。三个集合代表不同的操作系统。相交的部分是最大公约数,合并的部分是最小公倍数。
现在让我们来考察java gui工具集awt,swt和swing的区别
awt
awt 组件集遵循最大公约数原则,即awt只拥有所有平台上都存在的组件的公有集合。所以你在awt中无法获取如表或树等高级组件,因为它们在某些平台上不支持。awt的组件特征同样遵循这一原则。它只提高平台上公有的特征。例如awt按钮不能附着图片,因为在motif平台上,按钮是不支持图片的。
由于它低劣的组件集和特征,awt无法吸引开发者。它是sun不推荐使用的,只是为了确保向下兼容和支持swing。
swt
swt 最初的目标之一是为了提供比awt更为丰富的组件集。它遵循最小公倍数原则以提供一个各个平台上包含的组件的并集。思路是如果一个组件在某个平台上包含,那么swt就会包装它并用java代码和jni来调用它。如果一个组件在某一平台上不存在,它就会用继承并绘制composite的方式来模拟组件。一个 swt composite类似于awt的canvas。以这种方式,swt提供了较awt更为丰富的组件集。值得指出的是swt的jni封装不同于awt,它的模拟也不同于swing。
在组件特征方面,swt类似于awt。它遵循最小公倍数原则。在早期的swt版本中,swt按钮因为和awt同样的原因不支持附着图片。在之后的版本中,许多缺失的特征采用模拟的方式补全。但仍有许多特征无法采用纯粹的模拟实现。swt将组件的控制交给本地操作系统。它难以扩展。只有例如图形装饰等特征可以借助模拟绘制来自定义实现。所以严格意义上将,swt组件的组件集和特征因其难于扩展而不如swing来得丰富。
swing
swing 是三者中最强大和灵活的。在组件类型上,它遵循最大公约数原则。由于swing可以控制自身gui系统的全部并有很好的可扩展和灵活性,它几乎可以创建所有你想象得到的组件。唯一的限制是它的awt容器。在swing中你还不能跨平台地实现真正的透明化和不规则矩形窗口,因为swing依赖于awt顶层容器例如applet, window, frame and dialog等。除此之外,swing几乎实现了所有平台上的标准组件。
在组件特征上,swing遵循最小公倍数原则。它拥有所有平台上可提供的组件特征。不仅如此,你还可以继承已有的swing组件并添加新的特性。
上面比较主要是在api级别上的。让我们将比较的焦点转移到实现细节上。awt,swt和swing的区别是swing是纯java实现,而swt和awt 是java和jni的混合。当然,它们的目标都是相同的,提供一个跨平台的apis。然而为了达到这一点,swt和awt不得不牺牲一些组件和特性以提供一个通用的apis。
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上组件类需要作两次调用来实现文本的选择。
现在你应该能看出swt和awt的最大不同了,它们使用了不同的对等体编程方式来消除平台差异。swt用java代码或有jni实现的java对等体来黏合系统调用。而awt把代码包含在对等体中,使情况复杂化了,我个人觉得swt的方法更加明智。
swing
到了swing这里,一切就变得清晰和直接了。除了顶层容器,swing的实现不依赖于具体平台。它掌管了所有的控制和资源。swing所需要的是事件输入来驱动系统,以及承接自顶层awt容器的图形处理,字体和颜色。普通的swing组件可以看作是awt容器的一块逻辑区域。它们并没有注册对等体。所有添加到同一顶层容器的swing组件共享它的awt对等体以获取系统资源,如字体,图形处理等。swing将组件自己的数据结构存储在jvm的空间中。它完全由自己管理画图处理,事件分发和组件布局。
由于awt和swt都持有对本地组件的引用,它们必须以正确的方式释放这些引用以避免内存泄露和jvm崩溃。awt将绝大多数资源管理任务交给系统,将开发者从单调乏味的资源管理中解救出来。然而这使得awt的实现复杂化了。一旦它实现了,开发者很少有机会犯错误并使他们的程序崩溃。
swt 用的是另一种方法。大体上,swt让开发者自己来管理资源。它的一条著名的规则是:谁创建,谁释放。因此开发者必须谨慎地显式调用dispose方法释放每一个由他创建的组件和资源。这简化了swt的实现模型,但把开发者摆在了因错误编码而易于造成程序崩溃这一风险之上。
模拟方式的区别
swt和swing在它们的实现上都使用了模拟。swt只模拟平台上缺失的组件。区别是swt的模拟更像是awt的canvas实现的模拟。swt的 composite类有它自己在操作系统中相应的对等体。它从自己的对等体中获得所有它所需要的资源如图形处理的对象,字体和颜色等。它直接从操作系统获取所有的事件并进行处理。然而,swing组件在操作系统中没有相应的对等体。它只是一块顶层容器中的逻辑区域,实际上它从顶层容器的对等体中借用资源。 swing的事件并不是底层系统产生的事件。它们实际是由顶层容器处理awt事件所产生的伪事件。我们会在稍后的事件部分中详细介绍它。
图形层结构
另一个不同之处是swing组件的z-order系统是来自于awt组件的。如上所述,swing组件与顶层awt容器共享一个对等体。因此,swing组件也和顶层容器有相同的z-order。swt和awt组件都有不同于顶层容器的z-order,通常是高于顶层容器。故而如果awt组件和swing组件混合在一起的话,swing组件将可能被awt组件遮住。当操作系统开始更新ui的时候,顶层容器和swing组件总是先于awt组件绘制。当它们完成绘制,awt组件会覆盖swing可能绘制过的地方。因此不提倡swing和awt组件的混用。如果有一个浮动的swing组件如菜单,awt组件很可能遮盖菜单。以上是awt,swt和swing的区别的介绍
希望对你有帮助
2010-12-30
打赏
举报
回复
swt速度快,开发起来麻烦,没有规范的帮助,支持的平台有限
swing就很慢了。
swt比起swing真是一个天上一个地下啊!swing是难学难用,难编码,速度慢,界面奇丑无比。前段时间我还用的是wsad的gui设计器写swing程序,那叫一个麻烦--你仅仅要实现把按钮放在视窗底部,就要动用好几个嵌套的jpanel和layout!这还是在设计器的帮助下,如果你想手动编swing我劝你还是打消这个念头。另外swing的界面是非常难看的,仿佛回到了win 3.1。如果使用jdk 1.5的swing新主题(“海洋”主题,仿xp)的话,那还好一点,但是仍和windows下的其他软件格格不入。另外!swing显示中文字体真是难看到了极点,看了就让人徒生厌恶。还有速度慢。在我p4 1.8g上,你点个菜单,swing大概比native慢个零点几毫秒,但就点时间也让人感觉出了不爽,响应有迟滞。
py330316117
2010-12-30
打赏
举报
回复
swing是基于swt开发的,我们编程有个习惯,就是用上层的不用下层的,所以swing不错,不过swing也有一些swt有的她没有的(比如2d编程)。
fhuibo212
2010-12-30
打赏
举报
回复
强顶Swing,用过就知道
shenhong1990
2010-12-30
打赏
举报
回复
swing通用
猿敲月下码
2010-12-30
打赏
举报
回复
一些教科书都推荐使用swing,只有他们的道理
name99_6
2010-12-30
打赏
举报
回复
用swing
py330316117
2010-12-30
打赏
举报
回复
[Quote=引用 18 楼 sunyiz 的回复:]
引用 15 楼 py330316117 的回复:
swing是基于swt开发的,我们编程有个习惯,就是用上层的不用下层的,所以swing不错,不过swing也有一些swt有的她没有的(比如2d编程)。
这是哪个人告诉你的……
swing和swt什么时候有这种不可告人的关系了
你要是说swt是参考awt和Swing开发的还靠谱一点点
Swing是基于awt开发的……
[/Quote]
饿,记错了是awt
国强余富
2010-12-30
打赏
举报
回复
总结了下 推荐用SWING的偏多。
goodsun00
2010-12-30
打赏
举报
回复
swt速度快 不过没swing完整的规范
都可以,视个人具体情况而定
huntor
2010-12-29
打赏
举报
回复
[Quote=引用 9 楼 xiehongdong2009 的回复:]
RCP
[/Quote]
Eclispe RCP?
Netbeans RCP?
Spring RCP?
JavaFX?
Apache Pivot?
Swing Application Framework + BeanBindings + ... ?
ITJava
2010-12-29
打赏
举报
回复
RCP
Leguroky
2010-12-29
打赏
举报
回复
感觉都行....
HIAAAAAAA
2010-12-29
打赏
举报
回复
其实可以期待一下JavaFX 2.0,等于一个新的Java GUI API。
wenziming54
2010-12-29
打赏
举报
回复
我是用swing的
huntor
2010-12-29
打赏
举报
回复
swing 的第三方组件也比较多。
sunyiz
2010-12-29
打赏
举报
回复
如果你想你做出来的界面在什么机器上运行风格都一致
那就选Swing吧
如果你喜欢多样化,在什么系统上运行,按钮面板就是什么系统的风格的
那就用SWT
不过个人经验是,一个你调整好的布局,换一种控件风格来展示
很可能有的东西就歪了,或者挡住了什么
所以个人倾向于用Swing
不要说Swing难看,Swing有LookAndFeel而SWT没有
不要说Swing慢,控制好重绘区域,Swing一样可以很快,
而SWT调用系统控件,不一定效率就好到哪去
jcx396158820
2010-12-29
打赏
举报
回复
swt。。。
加载更多回复(2)
SWT
API
JAVA
窗口程序开发AWT/
Swing
外的另种开发方式
SWT
,AWT/
Swing
外,
java
的另一种
桌面
窗口程序的开发包。做
JAVA
桌面
窗口开发,我们有了更多的选择。此API是我自己生成的。对应的
SWT
版本是我网上下的最新的,版本是
swt
-3.4,里面没有API。网上也没找到最新版本的,我就自己尝试生成。呵呵。谢谢支持
Java
Swing
界面美化包-含源码
一款
JAVA
SE编程的皮肤美化界面插件包
Java
Swing
界面美化包-含源码
玩转
swt
jface
swt
face 高级进阶eclipse 插件开发前置教程
SWT
/JFace的核心应用与实战教程的PDF电子版.rar
基于
Java
桌面
程序开发的图形库主要有 3 种,它们分别是 AWT、
Swing
和
SWT
。用前 两种库编
写
的
桌面
程序不够美观而且执行效率低,响应速度慢,
SWT
恰好克服了 AWT 和
Swing
的缺点,它丰富的组件可以使程序员开发出功能很完善的 UI 程序。
SWT
是由 IBM 领 导的开源项目 Eclipse 的一个子项目,但
SWT
应用上也存在不足,
SWT
库反映的是本地操作 系统的基本窗口小部件,在许多环境下,这种方法较低级。JFace 库作为
SWT
的增强库很好 地弥补了它的缺点,JFace 对
SWT
的功能进行了很好的扩展。本书主要讲解了如何使用
SWT
和 JFace 进行
应用程序
的开发,通过本书系统而全面的
SWT
/JFace 知识学习,将帮助读者快 速开发出完美、实用的 GUI 程序,轻松完成繁琐的界面、菜单编程.
Eclipse
SWT
JFace核心应用相关应用及源码.rar
基于
Java
桌面
程序开发的图形库主要有 3 种,它们分别是 AWT、
Swing
和
SWT
。用前 两种库编
写
的
桌面
程序不够美观而且执行效率低,响应速度慢,
SWT
恰好克服了 AWT 和
Swing
的缺点,它丰富的组件可以使程序员开发出功能很完善的 UI 程序。
SWT
是由 IBM 领 导的开源项目 Eclipse 的一个子项目,但
SWT
应用上也存在不足,
SWT
库反映的是本地操作 系统的基本窗口小部件,在许多环境下,这种方法较低级。JFace 库作为
SWT
的增强库很好 地弥补了它的缺点,JFace 对
SWT
的功能进行了很好的扩展。本书主要讲解了如何使用
SWT
和 JFace 进行
应用程序
的开发,通过本书系统而全面的
SWT
/JFace 知识学习,将帮助读者快 速开发出完美、实用的 GUI 程序,轻松完成繁琐的界面、菜单编程。 本
Java SE
62,614
社区成员
307,327
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章