初学者眼中的 JavaFX2 和 Netbeans 平台






4.91/5 (4投票s)
一位新用户对两个 Java 桌面框架的看法
引言
从7.1版本开始,Netbeans放弃了对使用SWT构建图形桌面应用程序的支持,因此——受此影响以及需要重构一个小桌面应用程序的需求——我决定尝试两种用于构建此类程序的Netbeans Java框架。我将描述我在构建一个非常简单的应用程序时遇到的经历,该应用程序仅显示一个标题并列出主机(Windows)计算机当前可用的所有串行或并行端口。
背景
JavaFX 2和Netbeans平台是Netbeans中“内置”的Java框架。JavaFX 2是NB 7.1的新功能,是早期JavaFX的完全重写;Netbeans平台已经存在很长时间了。
摘要
这两种系统都提供了灵活、全面的应用程序构建环境。JavaFX更偏向于视觉/媒体,并产生简洁、清晰的代码;Netbeans平台在处理更大、更复杂的程序以及广泛的用户交互方面具有优势,但需要更多的项目管理才能有效。两者的文档都很丰富,但JavaFX告诉你为什么,但不告诉你怎么做;Netbeans告诉你怎么做,但不告诉你为什么——这两种方法对完全的新手来说都帮助不大。
引言
在做任何事情之前,我快速浏览了各种在线文档集和示例,并为每种技术总结了以下优缺点。
JavaFX
Pro
- 项目结构简单
- FXML允许将表单设计与驱动它的代码分离(Android开发者应该知道这是怎么回事!)。
- GUI元素等选择良好
- JavaFX已集成到最新的JVM分发版中,因此分发包很小。
- 代码(特别是使用FXML时)精简简单。
- 如果用户拥有最新的JVM,应用程序就可以在浏览器中运行,因此可以编写一个应用程序以供桌面和“云”使用。
- 内置支持播放各种形式的媒体
- 内置支持显示HTML等
- 一些出色的示例演示了系统的灵活性。我特别喜欢能够在浏览器窗口中运行Ensemble应用程序(GUI演示器),而无需在本地安装它。
- 应用程序可以使用CSS进行样式设置。
缺点
- 仅限Windows(评估时)
- 无GUI设计器(同样)
- 在我看来,关于FXML的重大文档缺失。
- 需要Java 7或更高版本
- 需要单独的JavaFX SDK(尽管该要求将在后续版本中移除)
Netbeans平台
优点
- 每个应用程序都内置支持Netbeans提供的绝大多数功能。
文本/HTML编辑器
可停靠窗口
工具栏和菜单
文件和数据库访问
属性设置等... - 一个良好、灵活的GUI设计器
- 内置支持HTML显示
- 经过充分的测试和检验,已有复杂的实际应用程序投入使用。
缺点
- 项目结构,即使对于一个非常简单的应用程序,也相对复杂,您编写的每个模块都是一个单独的Netbeans项目。
- 代码(和分发包)相对较大,因为核心平台必须与您的应用程序一起分发。
- 看起来需要大量的“语法糖”和连接代码/配置/属性来将应用程序的各个部分连接在一起形成一个整体——这是一项管理任务,需要额外完成,而不是解决正在编码的问题。
- 一些示例应用程序链接指向早已废弃的内容,我感觉该平台并不在Java开发者的“必备”列表中。
- 与其启用您想要的功能,不如“关闭”您不需要的功能。
尽管我正在重构的应用程序非常简单,并且根本没有实际的“计算”,但它仍然拥有几个相当繁忙的用户界面,因此——鉴于JavaFX中缺乏GUI设计器——选择一个框架并不像人们想象的那么简单!
我从IBM PC诞生之前就开始编写代码,我见过太多的开发“范式”出现又消失(通常不止一次,但每次名称都不同!),以至于我坚信在程序开发方面奥卡姆剃刀原则。(讽刺的是,奥卡姆——语言——并没有真正遵循这一原则……)
因此,用于基本JavaFX应用程序所需的简单、清晰的代码吸引了我,但同样——我可以看到,对于更大的应用程序来说,随时可以使用Netbeans平台的所有功能将是巨大的时间节省,弥补了更大的初始复杂性。我决定别无选择,只能在两个系统中构建一个测试应用程序,看看我会如何处理它们……
JavaFX 2
为什么所有人的文档都那么糟糕?
首先,稍作离题:多年来我注意到的一件事是,文档——特别是对于一个开发环境的完全新手来说——往往几乎无用,甚至可能误导。我知道如何解决我正在试图解决的问题,我缺乏的是如何使用提供的工具来表达这个解决方案。几乎每一个示例应用程序、演示环境等都假设相反的情况:我不知道如何将两个变量相加,但我知道描述GUI元素中每个组件的位置、大小、前景和背景颜色、字体以及总体样式的所有属性的名称,以及它们的可接受值、它们如何组合、它们如何与其他组件交互以及默认值(允许您在不知道这些的情况下创建“工作”应用程序)是什么以及它们的作用。
JavaFX在这方面非常糟糕。Ensemble应用程序提供了所有主要(和次要)GUI元素的可用示例,附带源代码。如果您正在用代码创建GUI,这是无价的。但是,如果您希望使用FXML分离代码和界面,那么它只有在偶然的情况下才有帮助……
创建应用程序。
我在Netbeans中创建了一个空的FXML应用程序。它包含足以编译和运行的代码,生成一个可点击的“hello world”GUI应用程序的变体。遵循Oracle的一个教程,我开始将其改编以在主机上执行一个简单的硬件测试,并在单击按钮时将结果显示在一个多行文本标签中。
我该如何描述我浪费的时间来找出为什么anchorPane在BorderPane中不能像StackPanes那样作为子项工作?或者为什么,在遵循示例时,我反正在使用StackPanes。Ensemble和API文档列出了标签、字段、窗格、子窗格等的*所有*可设置属性,但*仅以代码的形式*!FXML中的等效设置通常命名相似,但不总是如此!举个例子
这是创建具有指定大小、背景和描边的*新*Rectangle的Java代码。
Rectangle rectangle = new Rectangle(280, 70, Color.BISQUE);
rectangle.setStroke(Color.BLACK);
这是FXML等价物
<Rectangle width="280" height="70" fill="BISQUE" stroke="BLACK"/>
这也有效
<Rectangle width="280" height="70" style="-fx-fill: BISQUE" stroke="BLACK"/>
但这不起作用
<Rectangle width="280" height="70" style="-fx-fill:BISQUE -fx-stroke: BLACK"/>
我在API或FXML的文档中找不到任何关于如何设置Rectangle的描边或填充的说明,我是通过猜测和阅读别人的示例代码来找到的。**这不应该如此。**
我希望您会注意到,用于设置样式的FXML属性与执行相同功能的代码*不直接相关*。我估计我花了大约六个小时的时间搜索示例和阅读文档,最终才猜出了我需要的所有设置,以便我的测试应用程序的FXML能够正确运行,仅仅是因为代码API文档和示例中*没有提供FXML等价物*(甚至连提示都没有)。(还值得注意的是,属性在默认CSS样式中是预定义的,因此您需要阅读它才能找到名称等。)
Dustin's blog 提供了我能找到的所有实用的FXML帮助。他也抱怨FXML文档的缺乏。**ORACLE:如果FXML要有所发展,这真的需要解决!**
我很容易想象,为我的双窗口程序构建界面(至少是FXML)所花费的时间将远远超过编写执行工作的代码所需的时间……
由格式错误的FXML生成的错误消息在许多情况下也相当晦涩。
这是Netbeans中完整的项目结构。

Netbeans平台。
与JavaFX设置一样,创建一个新应用程序很简单,并且“开箱即用”的空应用程序就可以编译和运行——事实上,它的行为就像一个精简版的Netbeans,拥有所有窗口(包括启动屏幕)以及许多工具和设置,但没有任何实际功能。
然后,就像JavaFX一样,我使用教程作为构建应用程序的指南。同样,我也很快地失去了生活的意志,但原因却恰恰相反:教程告诉你如何做一切,但并没有真正告诉你为什么。
我越是阅读文档试图找出我需要做什么来构建这个简单的应用程序,我就越感到困惑——信息的量是压倒性的,我不禁觉得这与许多Java(尤其是微软)文档存在同样的问题——只有当你精确知道你正在寻找什么,以及更重要的是,它叫什么名字时,它们才有用。
尽管如此,在我仔细阅读并弄清楚构建我这个非常基本的应用程序所需要的一切之后,一切都变得简单了,尽管有点复杂。这就是平台默认值帮助您的地方,因为我无需编辑任何模块清单就可以使其正常工作。不过,我怀疑更复杂的应用程序可能会很快变得难以管理。
至于构建代码本身——在驱动不同显示架构的约束下,代码是相同的。使用Matisse编辑器构建基本GUI非常简单,尽管试图模仿JavaFX应用程序的外观在这个阶段看起来太难了,不值得费心。
与JavaFX应用程序相比,这个应用程序更大,加载速度明显更慢,但我还没有“关闭”所有我不需要的菜单、窗口等,所以这无疑会使情况变得更糟。
因此,您可以看到这两个框架在构建此测试程序方面的相对复杂性,这里是Netbeans平台版本与上述JavaFX2程序对应的项目结构(扩展到相同级别)。

结论
尽管拥有一个良好的交互式GUI设计器可以节省大量时间,但我从经验中知道,程序越复杂,维护和修改就越困难。我也喜欢JavaFX 2框架的简洁外观,Oracle承诺GUI构建器正在开发中。如果您不使用FXML,代码相当直接,文档也很全面,有很多有用的示例,但使用FXML分离布局和代码(这将是我的首选用法)目前非常碰运气,因为缺乏有意义的文档。
Netbeans平台“开箱即用”地为您提供了一个更全面的应用程序工具集,但复杂性和管理开销——这与您试图解决的问题无关——导致了非常陡峭的学习曲线。
如果您曾进行过Android开发,或者使用过Thinwire(我用过)这样的AJAX框架,那么JavaFX对您来说会很熟悉。将JavaFX应用程序发送到浏览器(无需安装)的能力是一个巨大的好处,Oracle致力于使JavaFX跨平台。除非有新的情况改变我的想法,否则JavaFX将取代SWT。
如果时间允许,我希望在客户桌面应用程序的重新开发过程中,提供一个更全面的JavaFX环境评测……
历史
版本 1 - 2012年2月14日。
一如既往,提交后才发现一些错别字,所以在同一天进行了少量修改!