我这些天尝试使用JavaFX做一个本地的Markdown编辑器,支持预览等功能,以方便写博客。最后因为JavaFX的TextArea中的一些问题导致无法继续,转而寻找其它的方案。
总结一下这段时间使用JavaFX的感受。
之所以选用JavaFX,主要是因为现在JavaFX已经支持Mac了,在主流的操作系统上都可以运行。同时官方提供的示例中,有一个Ensemble.jar,演示了各种各样很漂亮的JavaFX控件和特色,感觉很好:
同时它还提供了一个界面设计器Scene builder,也很精致:
还有一个可帮助调试Scenic View ,可以监控另一个运行中的JavaFX程序,实时查看各个控件的属性:
JavaFX现在还在紧张开发中,不成熟。虽然大体功能看起来都不错,但是一旦用得细了,经常会遇到各种各样的问题。
由于我想做的是一个markdown编辑器,在TextArea方面用得比较细,也因此发现了很多的问题:
没想到TextArea的这些基本功能居然有这么多问题。虽然我在官网上提了几个issue,但是不知道什么时候才能修复。我试着自己来处理它们以绕过这些问题,但是发现这些基本功能之间联系太紧密了,我几乎需要把所有的基本功能实现一遍,工作量太大了。
一段文字,使用同样的字体和字号,在JavaFX与浏览器中对比,发现JavaFX的显示没有浏览器中好看。主要问题是文字有点虚,不太清晰。所以我只好设置成比较大的字号,看起来会好一点。
JavaFX支持CSS样式,但是所有的属性都要以-fx-
开头。它实现了部分CSS属性,有一些常用的,比如line-height
它都没有提供。另外某些功能还不完善,比如-fx-font-family
,它只能设一个值。
这里是JavaFX所支持的CSS属性,需要时可过来查一下:http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html
虽然我们可以在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中定义就更好了。
主要是布局和样式方面,因为不能实时真实的看到样式的变化,所以只能修改后重启程序,非常低效。也许对于定义在css中的样式可以做到监控文件并重新加载,解决部分问题,但是我还没有来得及尝试。
我感觉自己的大部分时间是浪费在这上面了。
在JavaFX正在紧张开发的时候,API变化快出现不兼容是无法避免的。我在开发的过程中,必须使用jdk1.8_05
的版本,才能正确地使用某些第三方库。换一个小版本,都会出现编译错误。
比如用于显示提示信息的各种对话框,javaFx都没有内置,我们必须自己找第三方库解决。由于这些库没有进maven仓库,必须下载成jar包放在项目里,感觉很不方便。
https://github.com/freewind/ColaBlog
JavaFX是一个功能强大的Java GUI框架,相比swing等要好用很多。特别是binding的功能,可以让我们的代码简洁很多。
对于编辑器这样的功能,它还存在各种各样的问题;但对于通常的应用,我觉得应该没太大问题了,毕竟有SenceBuilder这样的案例可证明。
我想给它更多的时间,也许JavaFX就会担负起振兴Java GUI功能的重任了。