Javafx微调器未正确更新 - 如何调试Javafx源

时间:2017-11-07 07:25:10

标签: javafx clojure

我正在使用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 toStringfromString。一切都很好,除了有时我按下回车键时微调器没有“取”值。

具体来说,如果用户键入的字符串等于已显示的值(例如,显示毫米微调器的"10.0",并且用户键入"10mm""1cm")那么整个监听器和var手表的链条我已经绑在这件事上并没有开火。我认为这是因为在将用户的字符串转换为毫米defrecord后,JavaFX确定它已经等于ValueFactory值,并决定不激活ChangeListener。我可以验证即使从REPL也没有任何反应,我可以强制设置ValueFactory中的值。

问题:

  1. 如何对Javafx源进行逐步调试以验证是否发生了这种情况?我对Java非常蹩脚,但我有NetBeans和javafx源代码。

  2. 如何让JavaFX强制更新其observable?

  3. 感谢

1 个答案:

答案 0 :(得分:0)

我在观察者身上放了InvalidationListener而不是ChangeListener。即使将observable设置为已经存在的相同值,也会调用此方法。这并不像ChangeListener那样得到旧值,但我能够解决这个问题。