我正在使用Clojure为自定义类型实现JavaFX8微调器。类型(defrecords
)表示各种单位的距离,例如um,mm,cm,m,km,inch,mil。所以10mm的距离是#millimeter{:value 10.0}
,可以使用(cm ...)
函数转换为cm,返回#centimeter{:value 1.0}
等。
每个微调器实例都专门用于显示特定单元。例如,我有一个微调器,它始终使用毫米defrecord保持其ValueFactory
值。当用户键入"10"
等字符串时,将其视为毫米并显示为10.0
。但是当用户键入"10cm"
之类的字符串时,它会转换为毫米的defrecord,然后显示为100.0
。
我为微调器实现了SpinnerValueFactory
,并根据需要定义了StringConverter
toString
和fromString
。一切都很好,除了有时我按下回车键时微调器没有“取”值。
具体来说,如果用户键入的字符串等于已显示的值(例如,显示毫米微调器的"10.0"
,并且用户键入"10mm"
或"1cm"
)那么整个监听器和var手表的链条我已经绑在这件事上并没有开火。我认为这是因为在将用户的字符串转换为毫米defrecord后,JavaFX确定它已经等于ValueFactory
值,并决定不激活ChangeListener
。我可以验证即使从REPL也没有任何反应,我可以强制设置ValueFactory
中的值。
问题:
如何对Javafx源进行逐步调试以验证是否发生了这种情况?我对Java非常蹩脚,但我有NetBeans和javafx源代码。
如何让JavaFX强制更新其observable?
感谢
答案 0 :(得分:0)
我在观察者身上放了InvalidationListener
而不是ChangeListener
。即使将observable设置为已经存在的相同值,也会调用此方法。这并不像ChangeListener
那样得到旧值,但我能够解决这个问题。