Java GUI 框架。选择什么? Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot?

标签 java swing user-interface swt awt

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




8年前关闭。










锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。








有很多用于 Java 的 gui 框架,但是当今公认的首选框架是什么?

以下是我对不同框架的理解,如果我错了,请纠正我。这是一组定义非常松散的问题,但我仍然认为它对任何想要创建丰富的 gui 应用程序的人都很有值(value)。

AWT

是swing的基础,性能不错,但缺少高级组件。如果您打算创建丰富的应用程序,AWT 可能不是要走的路。但是对于不需要丰富用户界面的较小的 gui 应用程序。这可能非常适合,因为它是一个久经考验的框架。

Swing

如前所述,基于 AWT。在它的初期,它被认为是缓慢和有缺陷的,并导致 IBM 为 Eclipse 创建了 SWT。然而,在 Java 5(或 6?)中,Swing 成为构建新应用程序的首选框架。 Swing 有很多丰富的组件,但在某些方面仍然缺乏。一个例子是没有一个功能齐全的 TreeTable 组件可以进行排序和过滤/搜索。

SWT

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

SwingX

基于 Swing,它的使命是为 Swing 创建丰富的组件。仍在开发中。 (虽然不是很活跃。)有一组非常好的组件,例如 TreeTable。但据我所知,TreeTable 不支持过滤和排序。但是,它确实支持通过突出显示进行搜索。

Note that SwingX is components (AFAIU) that are extensions or compositions of existing Swing components



JGoodies

一个我一无所知的框架......它的优点和缺点是什么? Jgoodies 与其他产品有何不同?

JGoodies OTOH is about PLAFs and layouts.



JavaFX

Java/Oracle 的最新旗舰。有望成为开发丰富桌面或 Web 应用程序的事实标准。

Apache Pivot

它使用 Java2D 呈现 UI,从而最大限度地减少 Swing 和 AWT 的(IMO,臃肿)遗留的影响。 (@Augustus Thoo)

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

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

Qt Jambi

用 c/c++ 编写的原生 qt 库的 java 包装器。非常强大,被广泛使用和接受。有很多 GUI 组件和易于使用的 API。

http://qt-jambi.org/

所以,试着总结一下我的要求:

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

这些框架中的哪一个应该被视为已弃用,哪些应该被视为遥远 future 的框架?

什么是当今事实上的标准框架,您使用哪些工具来创建 java gui 应用程序?

我可能会后悔问这个问题,但无论如何我都会尝试:

据说 C#/.Net 有一组非常好的易于使用的组件,可以在任何可能的方向上进行弯曲。在某种程度上调查了不同的 Java 框架之后,我似乎无法对 Java 说同样的话。为什么是这样?为什么 java(世界上使用最广泛的编程语言)没有相同的 GUI 组件集?

是不是因为 java 的 gui 组件基于低得多的级别,并且可以编写我正在寻找的所有这些高级组件,但是您必须自己做很多工作?

最佳答案

决策树:

  • Qt 和 SWT 等框架需要 native DLL。所以你必须问自己:是否支持所有必要的平台?您可以将 native DLL 与您的应用程序一起打包吗?

    See here, how to do this for SWT .

    如果您在这里有选择,您应该更喜欢 Qt 而不是 SWT。 Qt 是由了解 UI 和桌面的人开发的,而 SWT 的开发是为了使 Eclipse 更快。它更像是 Java 1.4 的性能补丁而不是 UI 框架。如果没有 JFace,您将缺少许多主要的 UI 组件或 UI 组件的非常重要的特性(例如对表格进行过滤)。

    如果 SWT 缺少您需要的功能,则该框架对扩展它有些敌意。例如,您不能在其中扩展任何类(这些类不是最终的,它们只是在 this.getClass() 的包不是 org.eclipse.swt 时抛出异常,并且您不能在该包中添加新类,因为它是签)。
  • 如果您需要一个原生的纯 Java 解决方案,剩下的就交给您了。让我们从 AWT、Swing、SwingX——Swing 方式开始。

    AWT 已经过时了。 Swing 已经过时了(也许不那么过时,但在过去的 10 年里在 Swing 上所做的工作并不多)。您可能会争辩说 Swing 一开始很好,但我们都知道代码会腐烂。对于今天的用户界面来说尤其如此。

    剩下的就是 SwingX。经过较长时间的缓慢进展,development has picked up again . Swing 的主要缺点是它保留了一些旧想法,这些想法在 15 年前非常流行,但今天感觉“笨拙”。例如,表 View 确实支持过滤和排序,但您仍然必须配置它。您必须编写大量样板代码才能获得感觉现代的体面 UI。

    另一个薄弱领域是主题化。截至今天,周围有很多主题。 See here for a top 10 .但有些很慢,有些是错误的,有些是不完整的。当我编写 UI 并且用户提示某些东西对他们不起作用时,我讨厌它,因为他们选择了一个奇怪的主题。
  • JGoodies 是 Swing 之上的另一个层,就像 SwingX。它试图使 Swing 使用起来更愉快。该网站看起来很棒。让我们来看看教程......嗯......还在寻找......等一下。网站上似乎根本没有文档。 Google to the rescue .不,根本没有有用的教程。

    我对一个如此努力地向潜在新粉丝隐藏文档的 UI 框架没有信心。这并不意味着 JGoodies 不好;我只是找不到任何关于它的好话,但它看起来不错。
  • JavaFX。很棒,很时尚。支持在那里,但我觉得它更像是一个 Shiny 的玩具,而不是一个严肃的 UI 框架。这种感觉源于缺乏像树表这样的复杂 UI 组件。有一个webkit-based component to display HTML .

    当它被引入时,我的第一个想法是“晚了五年”。如果您的目标是一款适用于手机或网站的不错的应用程序,那很好。如果您的目标是专业的桌面应用程序,请确保它提供您所需要的。
  • 枢。我第一次听说。它基本上是一个基于 Java2D 的新 UI 框架。所以我昨天试了一下。没有 Swing,只有一点点 AWT ( new Font(...) )。

    我的第一印象是美好的。有大量文档可以帮助您入门。大部分examples come with live demos (注意:您必须在 Web 浏览器中启用 Java;这是一个安全风险)在网页中,以便您可以并排查看代码和生成的应用程序。

    根据我的经验,更多的精力花在代码上而不是文档上。通过查看 Pivot 文档,一定在代码中付出了很多努力。请注意,当前存在一个错误,导致某些示例无法在您的浏览器中运行 ( PIVOT-858 )。

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

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

    有希望。如果可以,请尝试一下。
  • 关于Java GUI 框架。选择什么? Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7358775/

    相关文章:

    java - 如何使用从另一个线程收到的信息更新主 UI? (当线程仍在运行时)

    android - 溢出菜单位置不正确

    JavaFx JFoenix Java9

    java - 如何将 OpenGL 上下文放入我当前的线程中,未找到 opengl 上下文

    java - 如何在 "onException"中设置 header 以使其在 Camel 路线结束之前都可见?

    java - 如何在运行时将项目插入 jcombobox 并保存

    java - 创建游戏启动器时出错

    java - 作为内部类的事件适配器

    java - Swing:当 JTree 更新时间过长并卡住其他 GUI 元素时该怎么办?

    java - 在客户端关闭后通过 SocketChannel 向客户端发送数据