JavaFX 2.0和Qt用于跨平台应用程序

14

我需要一些来自处理跨平台应用程序(特别是带有图形用户界面的程序)的开发人员的建议。

我很快就会创建一个需要跨平台的应用程序,因此我已经对两个不同的框架进行了一些初步研究:JavaFX 2.0和Qt。

说实话,两者都可以满足我的需求。所以我问自己为什么选择其中之一(剧透:我不知道答案: P)。我知道JavaFX 2.0相当新(截至2012年),并且在各个平台上的支持还不完全,但它最终会得到支持。

我提出的问题是:您会使用哪个跨平台应用程序,并在做出决定时看重哪些标准?

感谢您抽出时间阅读!:)

编辑: 在考虑这个问题时,供您参考的是,我将编写涉及读/写XML文件、显示图像和创建一些具有自定义功能的小部件的应用程序。我已经使用.NET和C#编写了类似的应用程序,但是在考虑JavaFX 2.0或Qt的跨平台可用性时需要建议。

再次感谢!:)


Swing,但最终取决于您试图实现的确切目标。跨平台足以做出决定。 - MadProgrammer
@MadProgrammer 我同意跨平台的能力足以做出决定。JavaFX 2和Qt都是跨平台的,而且它们看起来都相当易于开发。我用过Java中的Swing,但只是简单地使用过。你更喜欢Swing还是JavaFX 2或Qt呢? - FooBar
我更喜欢Swing,因为这是我所熟悉的。我也知道有很多非常好的开源API可供使用。因此问题来了。如果不知道您希望实现什么,很难提出建议。 - MadProgrammer
@MadProgrammer 谢谢!我更新了我的问题,包括应用程序将包含的活动类型的高级视图。这些都不是过于复杂的,并且我已经在C#中完成了非常类似的应用程序(以及其他几个不相似的应用程序)。这只是我第一次遇到需要跨平台的需求。 - FooBar
@MadProgrammer 嗯,就我个人而言,我不会建议在新项目中使用Swing。我认为JavaFX比Swing更一致、易于使用和功能丰富,并且将来会得到Oracle的大力支持。另一方面,Swing几乎已经死亡了。 - rolve
如果你想要一个跨平台且UI功能强大的应用程序,可以看看Electron框架。它使用HTML作为UI结构,JavaScript作为主要语言。更重要的是,你可以使用Visual Studio Code作为开发和调试Electron应用程序的强大专业工具。 - AmirHossein Rezaei
5个回答

20

这是一个老问题:稳定性还是前沿技术。我将根据您的应用特点尝试给出一些个人见解。

JavaFX 2.0相当新(截至2012年),并且在所有平台上都没有得到完全支持。

好吧,在Linux、Windows和Mac上完全支持。我可以这么说,因为我正在Mac上开发一个JavaFX 2.2应用程序,其中服务器在Linux箱上运行,客户端在Windows箱上运行。

读写XML文件

我还没有看到比sax2更好/更容易/更快地解析XML的工具/接口。当然QtXMLPatterns模块解析器值得尊重,但他们甚至正在开发基于SAX2的XML解析器(顺便说一句,并不完整,也不完全兼容传统的SAX1方法),所以我会说添加JavaFX 2的一些分数。

显示图像

两种技术都可以轻松显示图像,但JavaFX 2.2缺少一些图像处理工具(特别是格式编解码器)。如果图像处理是一个关键问题,我会说Qt在这场战斗中稍微领先一些。

创建一些具有自定义功能的小部件。

目前,这在JavaFX 2中不是一个容易的任务,因为Stage对象没有像ALWAYS_ON_TOP这样的选项,直到3.0(在2013年的某个地方)才会有。不过这并非不可能,但Qt已经有了一些好的工具用于自定义/显示/处理小部件,我们无法在JavaFX中复制。

您会使用这两种技术中的哪一种来开发跨平台应用程序,并在做出决策时考虑了哪些标准?

JavaFX 2.2是由Java制作和为Java而生的。我个人认为使用Java编程比C++更好、更容易。在Java中,你永远不必为指针而苦恼,你可以始终依靠垃圾回收器进行内存管理,在网络上有大量的教程和文档可供参考(我认为这超过了C++),同时还有一个不断增长的Java专家社区。

总之,我选择JavaFX 2.2是因为它漂亮、酷炫,我可以更轻松地处理MVC,而且我喜欢Java。但是如果您的应用程序的窗口部分是其主要目的,我认为您应该选择Qt。

希望这对您有所帮助,干杯!


谢谢您提供这么详细的答案,Bruno!我认为了解两者是很好的,但是对于即将要来的项目,我想选择JavaFX 2.2(耶,前沿技术!)。谢谢! - FooBar

13
我目前正在研究适用于开发离线HTML5创作应用程序的各种跨平台框架。除了跨平台操作(Windows,Linux,OS-X)之外,我的应用程序还具有以下主要要求:
嵌入式数据库 嵌入式(或次要的主流浏览器)HTML5渲染引擎 高功能的可编辑DND树、分隔面板和富文本编辑器小部件 中等强度的图像处理 USB存储器便携性
我认真研究了以下这些框架:
jQuery(JavaScript),HTML5,CSS3 Google Web Toolkit [GWT](Java转JavaScript) JavaFX 2.0(Java) QT(C++(Java绑定可用)) Xulrunner(XML,JavaScript) GTK+(C) Adobe Air Pyjamas
我花费了一笔不菲的钱购买了所有这些技术的书籍,并开始编写原型以查看每个框架可以带我走多快、多远。
最初,JavaFX 2.0以大幅领先的速度让我进展得最远。简单地说,这是因为使用JavaFX,所有工具、IDE、库、文档、代码示例、反馈、调试、社区支持、制造商(Oracle)支持和学习曲线都能以最少的阻抗匹配方式结合在一起。
JavaFX最大的优势可能在于它实现客户端嵌入式数据库(Derby)的简易性。而在其他框架中,这项任务却令人惊讶地更加困难和混乱。
不幸的是,当我发现WebView小部件无法执行来自本地file:// URL的JavaScript时,我遇到了严重的JavaFX障碍。 QtWebKit、GTKWebKit、Safari和Opera(所有基于WebKit)也表现出相同的file:// JavaScript阻止行为(但Chrome没有),因此我认为这是一个默认的WebKit安全措施。
当时,我认为file:// JavaScript问题是JavaFX的致命缺陷,所以我转向开发jQuery、GWT和Xulrunner原型。结果,我的原型制作生产力大幅下降。与JavaFX相比,这些其他框架的拼凑和阻抗失配明显更糟糕。
非常之多,经过数周在杂草丛中漫游后,我回到我的JavaFX原型机上,充满动力地寻找解决方法。最终,我通过在原型机中嵌入Java SE 6的Web服务器,并通过以下格式的URL加载JavaFX WebEngine来连接本地文件:"http://localhost:58357/xxxxx.html" 来解决了这个问题。以这种方式解除JavaFX原型机的阻塞就像回家一样。这是一股真正的清新之风,更不用说是一个巨大的生产力提升。

基于这些经验,以下是一些见解,可能对JavaFX与Qt之间的辩论有所帮助。

我同意JavaFX和Qt的问题,因为这两个框架分别成为我最喜欢、最高效的选择。 也就是说,我会将jQuery/HTML5/CSS3框架加入其中。这个框架非常强大,对于跨平台应用程序开发具有巨大的潜力,以至于我可以说它是不可避免的。在我的广泛搜索中,可编辑DND树、分隔面板和富文本wysiwyg编辑器小部件的领先候选人都是开源的jQuery插件。一旦你处理好了本地文件://问题,jQuery/HTML5/CSS3与JavaFX WebView小部件非常兼容。jQuery/HTML5/CSS3短板在客户端数据库存储方面。这就是JavaFX和jQuery/HTML5/CSS3框架组合极其强大的地方。
尽管它们是用C++编写的,但Qt模块具有Java和JavaScript语言包装器,这意味着开发人员不需要知道或使用C++来使用Qt。
这带来了一个问题,它不必是JavaFX vs Qt的问题,更有建设性和有益的问题可能是"JavaFX AND Qt?"。
这带出了另一个重要的观点:我很快发现,我最好的跨平台应用程序开发框架实际上是JavaFX 2、纯Java SE、Swing(用于遗留自定义小部件)、WebKit和jQuery/HTML5/CSS3的混合体。在未来,GWT、相关的第三方GWT库和Qt模块可能会加入到这个混合中。这里的重点是计划使用单一的、基因纯净的框架很快就被抛弃了。
目前,将整个混合框架绑定在一起的唯一共同线程是普通的Java SE。由于JavaFX 2是建立在Java SE上的,所以我的建议是从JavaFX 2开始,然后根据需要添加Swing、WebKit、jQuery/HTML5/CSS3、GWT和Qt。
最后,这篇文章帮助我决定加入JavaFX阵营。http://fxexperience.com/2012/04/interview-with-peter-zhelezniakov/

--H


哇,谢谢你!你帮我坚定了使用JavaFX来完成这个项目的决定。也许你说得对,它并不一定要被看作是二选一的情况。也感谢你提供的链接! - FooBar
很高兴能提供一些帮助。我刚刚找到了一种更优美的本地 .html 文件加载方式:使用 getResource() 方法将文件名转换为 Java URL 对象。将 url.toExternalForm() 加载到 JavaFX WebEngine 中,就可以完成了。我从书《JavaFX 2.0 Introduction by Example》中获得了这个提示,我认为你会觉得它是一个非常好的投资。我深入研究 JavaFX 2 时越发确信它是 RIA 的杀手锏。 - hataman
哎呀。脸红了。只需在文件名前加上 "file:/"(注意单个正斜杠),然后调用 WebEngine.load(file:/xxxxx.html)(而不是 WebEngine.loadContent()),JavaScript 在 WebView 中就能很好地工作。 - hataman
我也刚刚弄清楚了“file:/”是必需的。我有一点困惑,现在感到很高兴你也明白了! - FooBar
我在想这个描述是否已经过时了。我的JavaFx可以无问题地运行外部js文件。 - Eugene Kartoyev

8
我从时间戳中看到,4个月前我曾报道过我在原型研究项目中选择JavaFX2而不是QT。大约2个月前,我开始从JavaFX2转向QT,并且一直沿用至今。争论的主要焦点是从原型制作转向生产。在编写生产代码方面,QT被证明比JavaFX2更加先进。
总是有些细节问题需要注意,一些小东西会带来重大影响。使用JavaFX2时,我经常遇到和解决诸如无法控制的分割器窗格调整行为、有限的树控件和有限的WebKit API访问(例如尝试实现浏览器缩放按钮或将整个网页保存到本地HTML文件 - 可行但比应该的100倍笨拙)。当这些“次要”的解决方法结合起来时,进度几乎停滞不前。
使用QT时,这样的障碍要少得多,因此从原型到产品的转换自然、无缝且速度快得多。
不足之处在于,使用QT需要更长时间才能达到“Hello World”。但一旦达到目标,生产力很快超过并远远超越了JavaFX2。其中一个原因是QT文档、示例程序和开发者社区更加广泛。QT成立于1992年,而JavaFX2成立于2011年,这种年龄差异在两个GUI框架的成熟度上产生了显著的影响。
至于Java vs C ++问题,一直都不是问题。两种语言都很棒。就个人而言,出于效率、生产力和性能等多种原因,我发现C++是更优秀的GUI语言,但这只是个人结论。

2

我认为 Qt 最好、最有趣的部分是它的信号槽机制,尤其是在处理线程时,使用起来非常容易。


1

如果你熟悉.NET/C#,那么你也应该考虑使用Real Studio来创建跨平台应用程序。它肯定能够满足你所需创建的要求,并且比JavaFX或Qt更简单易用。


谢谢!在做出最终决定之前,我一定会仔细研究Real Studio。 - FooBar

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