Java GUI框架。该选择哪个?Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot?

227

有很多Java GUI框架,但哪个是当今被认为是首选的框架?

以下是我对不同框架的理解,请纠正我如果我错了。这是一组非常宽泛的问题,但我仍然认为对于任何想创建丰富GUI应用程序的人来说都是有价值的。


AWT

是 Swing 的基础,它表现良好,但缺乏高级组件。如果您想创建丰富的应用程序,可能不适合使用 AWT。然而,对于不需要丰富用户界面的较小 GUI 应用程序,这可能非常适合,因为它是一个经过验证的框架。


Swing

Swing基于AWT,早期被认为速度慢且存在缺陷,导致IBM为Eclipse创建了SWT。但是随着Java 5(或6?)的出现,Swing成为构建新应用程序的首选框架。Swing有许多丰富的组件,但在某些方面仍然缺乏,例如没有完整功能的TreeTable组件,无法进行排序和过滤/搜索。


SWT

SWT是由IBM为Eclipse创建的,他们似乎认为当时Swing不适合用于Eclipse。它本身相当低级,并且通过JNI使用平台的本地小部件。它与Swing和AWT没有任何关系。然而,它们的API有些笨拙且不直观。它们确实有一些高级组件,如TreeTable(但我认为它们不支持开箱即用的排序和过滤)。SWT使用一些本地绑定(通过JNI?),在互联网上对这个框架的抱怨是它不应该在今天的项目中使用。(为什么不呢?)


SwingX

SwingX基于Swing,旨在为Swing创建丰富的组件。目前仍在开发中(尽管不是非常活跃)。它拥有非常好的一套组件,例如TreeTable。但据我所知,TreeTable不支持过滤和排序。但它支持带有高亮的搜索。

请注意,SwingX是现有Swing组件的扩展或组合组件


JGoodies

这是一个我不了解的框架...它的优势和劣势是什么?JGoodies与其他框架有何不同之处?

另一方面,JGoodies专注于PLAF和布局。


JavaFX

JavaFX是Java/Oracle的最新旗舰产品,承诺成为开发丰富的桌面或Web应用程序的事实标准。


Apache Pivot

Apache Pivot使用Java2D来呈现UI,从而最小化Swing和AWT(在我看来过于臃肿)的影响。(@Augustus Thoo)

它的主要重点似乎是RIA(富互联网应用程序),但它似乎也可以应用于桌面应用程序。作为个人评论,看起来非常有趣!我特别喜欢它是一个apache项目。

https://cwiki.apache.org/PIVOT/frequently-asked-questions-faq.html


Qt Jambi

Qt Jambi是一个Java包装器,用于本地C / C ++编写的Qt库。非常强大,广泛使用和受欢迎。具有许多GUI组件和易于使用的API。

http://qt-jambi.org/


因此,为了尝试总结一下我所问的问题:

假设我今天想在Java中创建一个涉及许多高级组件的桌面应用程序,我应该选择什么?为什么?

这些框架中哪些应该被认为是过时的,哪些应该被认为是遥远未来的框架?

今天的事实标准框架是什么,您使用哪些工具来创建Java GUI应用程序?


我可能会后悔问这个问题,但我还是要试一试:

C#/.Net被认为拥有一套非常好用的易于使用的组件,可以在各种方向上灵活运用。经过对不同Java框架的一定调查后,我似乎无法说Java也具备相同的特点。为什么呢?为什么Java(世界上使用最广泛的编程语言)没有相同的GUI组件集?

难道只是因为Java将其GUI组件基于更低的级别,因此可能需要自己动手编写所有这些高级组件,而无法像C#/.Net那样轻松实现吗?


我不知道SWT是“基于AWT和Swing的组合”。真的吗?我以为它是纯JNI来调用操作系统的窗口系统... - Rich
@Rich哦,这是在其中一个答案的评论中提到的。我只是假设他们知道自己在说什么。 - netbrain
4
我认为你混淆了“UI Toolkit”和“GUI framework”。AWT,Swing和SWT是UI工具包,但我肯定不会称它们为“框架”。框架基于给定的UI工具包,并提供构建应用程序所需的粘合剂。首先,您应该选择UI工具包,然后选择适用于该工具包的框架。顺便说一下,我会选择Swing与我自己制作的Guts-GUI框架 :-) - jfpoilpret
1
对我来说,几乎总是Swing vs. SWT。如果想进行简单比较,可以查看以下内容:当有经验的Java SWT程序员转向Swing时,应该注意哪些主要事项? - Sorceror
9个回答

79

决策树:

  1. 像Qt和SWT这样的框架需要本机DLL。因此,您必须问自己:是否支持所有必要的平台?您能否将本机DLL与应用程序打包?

    在这里查看如何做到SWT

    如果您有选择,应优先选择Qt而不是SWT。Qt由了解UI和桌面的人员开发,而SWT则是出于使Eclipse更快的必要性而开发的。它更像是Java 1.4的性能修补程序,而不是UI框架。如果没有JFace,则缺少许多主要UI组件或UI组件的非常重要的功能(例如在表格上进行过滤)。

    如果SWT缺少您需要的功能,则对扩展它的框架有些敌对。例如,您无法扩展其中任何一个类(这些类不是最终版本,它们仅在this.getClass()的包不是org.eclipse.swt时引发异常,并且您无法添加新类在该包中,因为它已签名)。

  2. 如果您需要本地的纯Java解决方案,则剩下的就是这些。让我们从AWT、Swing、SwingX - Swing方式开始。

    AWT已过时。Swing已过时(也许不那么过时,但在过去的10年里没有太多关于Swing的工作)。您可以争辩说Swing一开始就很好,但我们都知道代码会腐烂。对于今天的用户界面来说,这尤其正确。

    这就使您使用SwingX。经过较长时间的缓慢进展后,开发工作又恢复了。Swing的主要缺点是它坚持一些旧观念,这些观念在15年前非常前沿,但今天却感觉“笨拙”。例如,表格视图支持过滤和排序,但仍然需要进行配置。您将不得不编写大量样板代码才能获得感觉现代化的不错UI。

    另一个薄弱的领域是主题定制。截至今天,有很多主题可供选择,这里列出了前十。但是它们中有些缓慢,有些存在漏洞,有些则不完整。当我编写UI时,如果用户因为选择了一个奇怪的主题而抱怨某些功能无法使用,我会感到很烦恼。

  3. JGoodies是另一种类似于SwingX的层,旨在使Swing更易于使用。网站看起来很棒。让我们看看教程...嗯...还在寻找...稍等。似乎网站上根本没有文档。Google来帮忙。不,根本没有有用的教程。

    我对一种试图让新粉丝难以找到文档的UI框架不太自信。这并不意味着JGoodies不好;只是我无法找到任何值得称赞的东西,除了它看起来很漂亮。

  4. JavaFX。很棒,时尚。支持在那里,但我觉得它更像是一个耀眼的玩具而不是一个严肃的UI框架。这种感觉源于缺乏像树形表格这样的复杂UI组件。有一个基于Webkit的组件可用于显示HTML。

    当它被介绍时,我的第一反应是“晚了五年”。如果你的目标是为手机或网站创建一个不错的应用程序,那么很好。如果你的目标是专业的桌面应用程序,请确保它提供所需的功能。

  5. Pivot。我第一次听说它。它基本上是一个基于Java2D的新UI框架。所以我昨天试了一下。没有Swing,只有一小部分的AWT (new Font(...))。

    我的第一印象很不错。有详细的文档可以帮助你入门。大多数示例都配有实时演示(注意:您的网络浏览器必须启用Java,这是一种安全风险),因此您可以看到代码和结果应用程序并排显示。

    根据我的经验,编写代码所需的工作量比编写文档还要多。从Pivot文档中可以看出,许多工作都花费在了编写代码上。请注意,当前存在一个错误,阻止某些示例在您的浏览器中运行(PIVOT-858)。

    我对Pivot的第二个印象是它易于使用。当我遇到问题时,通常可以通过查看示例来快速解决。然而,我错过了每个组件支持的所有样式的参考。

    与JavaFX一样,它缺少一些更高级的组件,如树表组件(PIVOT-306)。我没有尝试使用表视图进行懒加载。我的印象是,如果底层模型使用懒加载,则足够了。

    很有前途,如果可以,请尝试一下。


尝试了数据透视表演示“Kitchen sink”,在打开一些分组后,它一直占用整个 CPU。如果这是因为数据透视表设计问题,那么我绝对不想在我的项目中使用它。 - Display Name
看起来我已经找到了问题的源头,并且在后续版本中已经修复:http://apache-pivot-users.399431.n3.nabble.com/Expanders-Cause-Increased-CPU-and-Memory-Use-td4022102.html - Display Name
2
JavaFX 8(适用于Java 8及以上版本)具有TreeTableView小部件。然而,JavaFX 2.2(适用于Java 7)缺少此功能,并且缺少标准的错误和信息对话框:请参见https://dev59.com/kmgu5IYBdhLWcg3wASWO#12760202。此外,ControlsFX小部件库仅适用于Java 8:http://fxexperience.com/controlsfx/。 - kostmo

12

SWT本身相当低级,通过JNI使用平台原生的小部件。 它与Swing和AWT没有任何关系。 Eclipse IDE和所有基于Eclipse的富客户端应用程序(例如Vuze BitTorrent客户端)都是使用SWT构建的。 此外,如果您正在开发Eclipse插件,则通常会使用SWT。
我已经开发基于Eclipse的应用程序和插件将近5年了,所以我显然有偏见。 但是,我还具有丰富的在SWT和JFace UI工具包方面的经验,后者是在其之上构建的。 我发现JFace非常丰富和强大; 在某些情况下,它甚至可能是选择SWT的主要原因。 只要是类似IDE(带有表格、树形控件、本机控件等)的UI,它就能让您快速创建一个可工作的UI。 当然,您也可以集成自定义控件,但需要额外的努力。


在你的观点中,一个带有列排序和过滤功能的高级组件,比如TreeTable,在SWT+JFace中会是一个大问题吗? - netbrain
@netbrain:我已经做过很多次了,使用JFace相当简单。这就是我所说的“类似IDE”的界面,也许并不是最好的词选择。 - Zsolt Török

9
我建议使用另一个框架:Apache Pivot http://pivot.apache.org/
我简单试用了一下,对它作为RIA(Rich Internet Application)框架提供的功能印象深刻,类似于Flash。
它使用Java2D来渲染UI,从而最小化Swing和AWT(在我看来过于臃肿)的影响。

1
我有印象NetBrain在询问桌面应用程序。对于RIA框架,还要考虑GWT和Vaadin。这些框架允许您使用Java编写代码,编译并获得JavaScript,可以在所有常见的Web浏览器上运行得非常好。 - Costis Aivalis
桌面应用程序可以应用数据透视表吗? - netbrain
也许这是一个定义问题,但RIA框架基本上是为在浏览器中运行而设计的。 - Costis Aivalis
2
@netbrain:是的,您可以将Pivot作为桌面应用程序(JFrame)或小程序(JApplet)运行。 - Augustus Thoo

9

Swing + SwingX + Miglayout 是我首选的组合。Miglayout 比 Swing 的 200 种不同布局管理器更简单,而且更加强大。此外,它还提供了“调试”布局的功能,这在创建复杂布局时特别方便。


8
另一个选择是使用Qt Jambi。它几乎拥有Qt的所有优点(许多组件,良好的文档,易于使用),而无需C++的麻烦。我3-4年前在一个小项目中使用过它,即使那时它也几乎成熟了。
你可能想看看关于Swing vs. Qt的讨论这里

5

个人意见:选择使用NetBeans平台和Swing。

如果您需要高级组件(超出NetBeans所提供的),则可以轻松地集成SwingX(或JGoodies),因为NetBeans平台完全基于Swing。

如果没有建立在底层UI框架上的良好平台,我不会开始编写大型桌面应用程序(或即将成为大型应用程序)。

另一个选项是Eclipse RCP与SWT一起使用,但是将“纯”Swing组件集成到这样的应用程序中可能较困难(但并非不可能)。

对于NetBeans平台来说,学习曲线有点陡峭(尽管我认为对于Eclipse也是如此),但是有一些不错的书籍值得推荐。


1
请注意,SwingX是现有Swing组件的扩展或组合组件(AFAIU)。另一方面,JGoodies涉及PLAF和布局。但正如您所说,两者都可以与Swing无缝集成。 - Andrew Thompson
1
基于Swing进行开发。Swing建立在AWT之上,包括轻量级组件,这些组件在所有平台上的外观和行为都相同,因此您永远不应直接使用AWT组件。有许多出色的Bean可以轻松地添加到您的GUI开发中,例如toedter.com的JCalendar。 - Costis Aivalis
1
除了 PLAF 和布局之外,JGoodies 还提供了更多功能:bean 绑定(用于演示模型模式)、验证和一个“类似 JSR-296 的”框架(它是商业化的)。 - jfpoilpret

3

您忘记了基于JSR296的Java桌面应用程序,它作为NetBeans内置的Swing框架。

除了AWT和JavaFX,您描述的所有框架都基于Swing,如果您从Swing开始,则可以清楚地了解所有这些Swing(基础框架)

ATW、SWT(Eclipse)、Java Desktop Application(Netbeans)、SwingX、JGoodies

所有这些框架(我不知道更多关于JGoodies的内容),包括JavaFX,已经很长时间没有进展了,许多基于Swing的框架都已停止,如果没有最新版本,就更不用说了。

只是我的观点-其中最好的是SwingX,但需要对Swing有深入的了解。

Swing的基础框架外观


一部分涉及AWT组件,另一部分涉及Swing JComponents,但是在AWT和Swing之间实现、可访问和继承方法方面存在差异。例如,Swing JComponents直接(API)从AWT中继承或嵌套了很多方法 :-) - mKorbel
JSR296已经死了。它不再“维护”,并且NetBeans中已删除对其的支持。(而且它从一开始就不是一个真正好的框架) - user330315
@a_horse_with_no_name 正确,在 SWT、SwingX 中都有相同的进展,新的所有者,新的方式。 - mKorbel
1
SWT是IBM开发的,不基于Swing,而是一种竞争性技术。Swing使用AWT。JavaFX也不是基于Swing的,它是一个全新的框架。有些人称其为Swing的继承者,但它还太不成熟,不能下定论。我目前正在做同样的决定,Swing是我的选择,仅仅因为它是最成熟、现实可行的选项。 - Gordon
1
SwingX是Swing的扩展(这就是为什么它需要Swing知识),事实上,SwingX的一些功能已经被整合到Swing中。 - Gordon

3

我一直对Swing在我参与的桌面应用程序中表现得相当满意。然而,我也认同你对Swing没有提供高级组件的看法。在这些情况下,我所做的是选择JIDE。它不是免费的,但价格也不算贵,并且它会给你更多的工具。具体来说,它们提供了一个可过滤的TreeTable。


好知道!所以JIDE基于Swing创建了自己的组件... - netbrain
是的,JIDE 制作了相当多覆盖网格、树形结构、表格、图表等方面的组件。正如我所说的,它不是免费的,但考虑到自己制作这些东西需要的时间,您最好使用已经制作好的东西。此外,据我了解,JIDE 在让开源项目使用他们的组件方面很灵活,只要在“关于”对话框中提供一个指向他们网站的链接或标志即可。 - sbrattla

3
我会选择Swing. 对于布局我会使用JGoodies form layout。这里值得研究一下Form Layout的白皮书-http://www.jgoodies.com/freeware/forms/
此外,如果您要开始开发大型桌面应用程序,您肯定需要一个框架。其他人已经指出了NetBeans框架。我不太喜欢它,所以写了一个新的框架,我们现在在公司中使用。我把它放到了SourceForge上,但没有找到时间对其进行详细的文档说明。这是代码浏览链接:http://swingobj.svn.sourceforge.net/viewvc/swingobj/
展示应该向你展示如何做一个简单的登录...。
如果您有任何问题,我可以帮忙,请告诉我。

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