β

JavaFX试用

Freewind @ Thoughtworks 1504 阅读

我这些天尝试使用JavaFX做一个本地的Markdown编辑器,支持预览等功能,以方便写博客。最后因为JavaFX的TextArea中的一些问题导致无法继续,转而寻找其它的方案。

总结一下这段时间使用JavaFX的感受。

选用JavaFX的原因

之所以选用JavaFX,主要是因为现在JavaFX已经支持Mac了,在主流的操作系统上都可以运行。同时官方提供的示例中,有一个Ensemble.jar,演示了各种各样很漂亮的JavaFX控件和特色,感觉很好:

QQ20140517-3

同时它还提供了一个界面设计器Scene builder,也很精致:

QQ20140517-5

还有一个可帮助调试Scenic View ,可以监控另一个运行中的JavaFX程序,实时查看各个控件的属性:

QQ20140517-6

我所感受到的优点

  1. 支持多种操作系统,比如windowx, mac, linux, Solaris,另外似乎Raspberry Pi也支持
  2. 可使用fxml/css/java来分离界面、样式和逻辑,如同html/css/javascript
  3. fxml与相应的controller之间结合得比较好,可以方便地互相引用
  4. 支持binding,可以在fxml中方便地引用controller中的属性或者事件处理方法
  5. 几乎所有的属性都可以添加listener,以监控其值的变化

我所遇到的问题

JavaFX现在还在紧张开发中,不成熟。虽然大体功能看起来都不错,但是一旦用得细了,经常会遇到各种各样的问题。

TextArea问题很多

由于我想做的是一个markdown编辑器,在TextArea方面用得比较细,也因此发现了很多的问题:

  1. 我想按下cmd + =的时候放大字体,但是发现它会多触发两个按键事件。所以我需要额外添加按键间隔时间的检查,以绕过这个问题
  2. 当我选择了一些比较好看的字体后,发现按向下方向键时,光标有时候无法跳到下一行
  3. 当我按shift + up来选择文字的时候,它无法选中第一行
  4. 当我在一行长中文前添加空格时,中文整行会向下跳一行,但是行首并没有显示出空格

没想到TextArea的这些基本功能居然有这么多问题。虽然我在官网上提了几个issue,但是不知道什么时候才能修复。我试着自己来处理它们以绕过这些问题,但是发现这些基本功能之间联系太紧密了,我几乎需要把所有的基本功能实现一遍,工作量太大了。

2. 文字显示效果不太好

一段文字,使用同样的字体和字号,在JavaFX与浏览器中对比,发现JavaFX的显示没有浏览器中好看。主要问题是文字有点虚,不太清晰。所以我只好设置成比较大的字号,看起来会好一点。

3. CSS支持不完善

JavaFX支持CSS样式,但是所有的属性都要以-fx-开头。它实现了部分CSS属性,有一些常用的,比如line-height它都没有提供。另外某些功能还不完善,比如-fx-font-family,它只能设一个值。

这里是JavaFX所支持的CSS属性,需要时可过来查一下:http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html

4. 布局略显繁琐

虽然我们可以在fxml文件来布局,但是还是不够方便。比如我想让各组件在resize时,能自动按一定规则缩放,就无法在fxml中设置,只能在对应的controller中,依次调用如:

HBox.setHgrow(editorPane, Priority.ALWAYS);
HBox.setHgrow(previewPane, Priority.ALWAYS);
HBox.setHgrow(preview, Priority.ALWAYS);

这样的方式给它们每个都设上这样的一个属性。有时候我们其实用不上某个控件,但仅仅因为布局,就需要在controller里声明对它的引用:

@FXML private BorderPane previewPane;

如果能在布局方面做得更好一些,比如可以直接在fxml文件中实现, 或者在CSS中定义就更好了。

5. 调试不方便

主要是布局和样式方面,因为不能实时真实的看到样式的变化,所以只能修改后重启程序,非常低效。也许对于定义在css中的样式可以做到监控文件并重新加载,解决部分问题,但是我还没有来得及尝试。

我感觉自己的大部分时间是浪费在这上面了。

6. API变化快

在JavaFX正在紧张开发的时候,API变化快出现不兼容是无法避免的。我在开发的过程中,必须使用jdk1.8_05的版本,才能正确地使用某些第三方库。换一个小版本,都会出现编译错误。

7. 某些常用组件缺失

比如用于显示提示信息的各种对话框,javaFx都没有内置,我们必须自己找第三方库解决。由于这些库没有进maven仓库,必须下载成jar包放在项目里,感觉很不方便。

源代码

https://github.com/freewind/ColaBlog

总结

JavaFX是一个功能强大的Java GUI框架,相比swing等要好用很多。特别是binding的功能,可以让我们的代码简洁很多。

对于编辑器这样的功能,它还存在各种各样的问题;但对于通常的应用,我觉得应该没太大问题了,毕竟有SenceBuilder这样的案例可证明。

我想给它更多的时间,也许JavaFX就会担负起振兴Java GUI功能的重任了。

作者:Freewind @ Thoughtworks
原文地址:JavaFX试用, 感谢原作者分享。