Java桌面应用程序:SWT vs. Swing

158

我是一名白天从事网页开发的人,现在考虑开发我的第一个真正的桌面应用程序。这个想法是构建一个工具,自动完成一项非常重复的任务,而该任务无法使用API实现。

我知道我想使用Java。我以前用过它做Web开发,很熟悉语法,并且希望应用程序尽可能地跨平台。

我不确定的是是否应该使用SWT或Swing。由于我的主要受众使用Windows,我希望在那里看起来尽可能本地化。Linux和Mac应该可以工作,但外观并不那么重要。

那么,对于每个UI框架,即Swing或SWT,有哪些支持和反对的论点呢?

谢谢。

PS:我在Windows上使用Eclipse进行开发。但是我正在考虑尝试Netbeans。


有点难回答。 :-) 我会选择Swing。但是,对于这个决定我没有任何正面或负面的意见。 - Pablo Santa Cruz
请查找已经在SO上提出的Swing vs. SWT问题,以避免重复。顺便说一下,我之所以使用Swing,只是因为我是这样学习的。有本地外观库(请参见jgoodies looks)。 - Jason S
构建一个工具,自动化 Web 应用程序中的重复任务。有关此事的任何信息?可能已经存在一个工具,我质疑需要桌面应用程序来自动化此过程 - 它现在可能在您的情况下起作用,但如果您转移到托管解决方案呢? - Nate
你不需要为了桌面应用程序学习GUI框架。如果你会使用HTML、CSS和JS(我假设你会),你可以使用Electron来使用Web语言构建本地外观的应用程序。 - Pranav A.
Electron 是在我提出这个问题几年后发明的 ;) 但是当然,今天你是正确的。 - janpio
10个回答

153

Swing的优点:

  • 是Java库的一部分,无需额外的本地库
  • 在所有平台上都以相同的方式工作
  • Netbeans和Eclipse中均有集成的GUI编辑器
  • 有Sun/Oracle提供的良好的在线教程
  • 受官方Java扩展(如Java OpenGL)的支持

Swing的缺点:

  • 本地外观和感觉可能与真实的本地系统不同
  • 重组件(本地/awt)会隐藏Swing组件,在大多数情况下不是问题,因为使用重组件的情况相对较少

SWT的优点:

  • 可能时使用本地元素,因此始终具有本地行为
  • Eclipse支持,GUI编辑器VEP(VEP也支持Swing和AWT)
  • 有很多在线示例
  • 具有集成的AWT/Swing桥,允许使用AWT和Swing组件

SWT的缺点:

  • 需要每个支持的系统的本地库
  • 由于使用本地资源(提示选项),可能不支持所有系统上的每种行为
  • 管理本地资源时,虽然本地组件通常会随其父级一起被释放,但其他资源(如字体)必须手动释放或注册为组件的dispose listener以进行自动释放。

34
Swing将更接近“一次编写,到处运行”。SWT则更像“一次编写,多处微调/测试”。但这种讨论也发生在其他编程语言中。 - Mark
13
实际上,Swing的“本地”外观和Gnome桌面有很大不同--尽管主题可以很好地工作,但是菜单看起来很糟糕且几乎无法使用。 - Hut8
10
从 Eclipse 3.7 开始,VEP 已被 WindowBuilder 取代(它同时支持 Swing 和 SWT)。 - Alexey Romanov
7
SWT的优势还在于其使用本地组件,因此内存消耗更少。这对于内存有限的计算机是非常理想的,在大型GUI设计中,Swing和SWT之间的内存差异可能会很大。 - jantobola
1
@JanTobola 它是完全错误的。本地组件使用在本地堆上分配的内存,而不仅仅是Java堆上的内存。我曾经使用Netbeans平台、Eclipse RCP、SWT和Swing开发过大型GUI,早期版本的Java(当它还是第三方库时以及1.1到1.2之后)中对Swing的内存占用有严重担忧,但现在已经不再成立了,在 SWT 中释放大量资源时存在更多的内存泄漏机会,而在 Swing 中,未引用的组件最终会被“disposed”掉。 - gouessej
显示剩余3条评论

64

需要考虑的一件重要事情是,有些用户和某些经销商(如戴尔)在其64位Windows上安装了64位VM,并且您无法在32位和64位VM上使用相同的SWT库。

这意味着您需要根据用户是否拥有32位或64位Java VM来分发和测试不同的软件包。例如,参见此问题,但您也可以在Eclipse中遇到它,在当前下载页面上构建的软件无法在64位VM上运行。


2
有趣的观点。作为用户,我仍然惊讶于为什么这是一个如此重要的问题。但好吧,既然如此,我将不得不考虑这个问题。谢谢。 - janpio
顺便说一下,我认为javaws(Webstart)不适用于64位。 - Karussell
1
@Karussell: 截至2011年3月4日,Sun的64位Windows JVM已支持JNLP。我认为这已经是很久以前的事了,但我不确定多久。 - The Alchemist

23

Pro Swing:

  • 我认为Swing最大的优点是您不需要随应用程序一起提供库文件(这可以避免数十MB的大小!)。
  • Swing的本地外观比早年要好得多。
  • 性能与SWT相当(Swing并不慢!)。
  • NetBeans提供了Matisse作为一个舒适的组件构建器。
  • 在JavaFX中集成Swing组件更容易。

但总的来说,我不建议使用“纯”Swing或SWT ;-) 有几个适用于Swing/SWT的应用程序框架。 在这里看看。 最重要的玩家是NetBeans(Swing)和Eclipse(SWT)。另一个不错的框架可能是Griffon,而一个漂亮的“组件集”是Pivot(Swing)。Griffon非常有趣,因为它集成了许多库,不仅仅是Swing; 还有Pivot、SWT等等。


1
是的,NetBeans有Matisse作为GUI构建器,但代码非常冗长,阅读起来令人困惑,并且几乎不可能通过源代码进行编辑。如果您真的想要一个GUI构建器,请选择eclipse的WindowBuilder。 - Pranav A.

14

我会使用Swing,有几个原因。

  • 它已经存在了很长时间,并且已经有更多的开发工作应用于它。因此,它可能更加功能完整,也许有更少的错误。

  • 有许多文档和其他指南可用于生成高性能应用程序。

  • 似乎对Swing进行的更改同时传播到所有平台,而对SWT的更改似乎首先出现在Windows上,然后是Linux。

如果您想构建一个非常功能丰富的应用程序,可以尝试查看NetBeans RCP(Rich Client Platform)。虽然有一定的学习曲线,但练习一下就可以快速地制作漂亮的应用程序。我没有足够的Eclipse平台经验来做出有效的判断。

如果你不想使用整个RCP,NetBeans还有许多有用的组件可以单独提取和使用。

另一个建议是,了解不同的布局管理器。当我学习时,这些使我困惑了很长一段时间。一些最好的甚至不在标准库中。在我看来,MigLayout(适用于Swing和SWT)和JGoodies Forms工具是最好的两个。


10

2
链接已损坏! - Socrates

8

根据您的需求,似乎最好使用Swing,因为它比SWT更容易入门,而且与本地平台的集成程度不太紧密。

通常情况下,Swing是一个安全的选择。


6

5
请注意,这篇文章是来自2003年... - Alexey Romanov

5

需要考虑的一点:屏幕阅读器

由于某些原因,一些 Swing 组件在使用屏幕阅读器(以及 Windows 的 Java AccessBridge)时无法正常工作。请注意,不同的屏幕阅读器会导致不同的行为。在我的经验中,SWT-Tree 在与屏幕阅读器结合使用时表现要比 Swing-Tree 好得多。因此,我们的应用程序最终使用了 SWT 和 Swing 组件。

要分发和加载正确的 SWT 库,您可以在此链接中找到有用的信息: http://www.chrisnewland.com/select-correct-swt-jar-for-your-os-and-jvm-at-runtime-191


3
如果您打算构建具有多个功能的完整应用程序,我建议直接使用Eclipse RCP作为框架。
如果您的应用程序不会变得太大或者您的要求太独特,不能由普通的业务框架处理,那么您可以安全地使用Swing。
最终,我建议您尝试两种技术,找到适合您的那一种。就像Netbeans vs Eclipse vs IntelliJ一样,这里没有绝对正确的答案,两个框架都有自己的缺点。
Swing的优点:
- 更多专家 - 更像Java(几乎没有公共字段,无需在资源上进行处理)
SWT的优点:
- 更本地化 - 更快

10
我认为“更快”这一点非常有争议。 - Russ Hayward
SWT使用起来很麻烦,我不得不在每个Windows版本上测试我的GUI,有些bug只能在Windows Vista下重现。一些方法根本没有实现或者在底层调用AWT,这意味着你不能使用不带AWT的紧凑JRE,也不能使用Swing而不冒着破坏SWT的风险。我从2009年开始使用SWT,但在我看来,它并不比其他框架更快。我建议您提供一个精心设计的基准测试。 - gouessej
@gouessej 你需要AWT和Swing来运行Swing。 - SamB
@SamB 那又怎样? - gouessej

3

SWT是为了应对世纪之交Swing的迟缓而创建的。现在由于性能差异变得可以忽略不计,我认为Swing对于标准应用程序来说是更好的选择。SWT/Eclipse有一个不错的框架,可以帮助您处理很多样板代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接