JavaFX8 随录 一 Combobox 控件bug

2017.04.15 13:29 Sat| 190 visits | Text

最近自己做桌面软件开发,由于有跨平台需求,所以抛弃了.net微软系。最终确定在java和js阵营选择。
NodeJs开发跨平台应用还是很爽的,性能也还过的去。奈何js这门语言真不是我的菜,用js做了个小项目之后,对js实在是爱不起来。各种打包,各种前端工具,实在没精力一一学习。鉴于自己半吊子的js实力,还是去熟悉的java阵营看看吧。

AWT、SWING、SWT、JavaFX这些各有千秋。JavaFX8从javaFX2进化而来,是最新的javaUI框架。Oracle把JavaFX8的API集成到了Java8 SDK之中,成为Java8的一部分,使用起来非常方便。用XML定义布局,有图形化的布局工具,支持使用css渲染界面效果,良好的MVC架构和属性绑定设计。开发过程跟Android开发有很多相似之处。优点很多,国外已经比较流行了,国内却是不温不火,中文资料非常少。

我准备在这个软件的开发过程中,整理一些经验和遇到的坑。算是做个记录,遇到什么问题记录一下,条理性可能要差一点。

我在使用Combobox下拉框的过程中,设置一个Combobox对象的onAction事件,下拉选择Combobox值,触发其onAction调用,获取该Combobox的值,然后进行后续的处理。
在这个过程中遇到一个现象:我在Controller的initialize方法中设置该Combobox的默认值,然后我期望在初始化时也能收到该默认值触发的onAction事件。结果默认值设置生效了,onAction却没有被调用。初始化完成后,选择Combobox下拉中的值,能正常触发onAction。

这个问题是因为Combobox中的ActionEvent不是由Controller触发的,而是由该控件的Skin触发的,在Controller的initialize方法被调用时,Skin类还没有被初始化,导致收不到默认值的onAction事件。(Skin类和Controller类的关系大家可以看下官方文档)在这个OpenJDK的jira库中发现了这个问题的issue:JDK-8087704。我目前的解决方法是,在设置初始化值之后,手动使用初始化值调用一遍后续的流程。这个问题期望Java9中能修复吧。