Dealing with nested events for a single property in JavaFX

Jonathan Giles jonathan.giles at oracle.com
Thu Jun 21 15:20:18 PDT 2012


Hi all,

I'm going to keep this brief as I'm fairly comprehensively underwater on 
the bug count.

Recently I've found a pattern of bug that, well, I'm fairly sure is due 
to user error, but is not obvious at all (and as such it leads to bug 
reports). In the last week, I've encountered this issue twice. The basic 
issue is that of listening to an event (for example, a focus change 
event), and reacting in such a way as to modify the state of this 
property (which results in another event being fired). The end result is 
non-deterministic (but often broken behavior). Interestingly, it has in 
both my cases manifested itself as something that works once, and then 
fails after that forever more.

In both cases, after much code digging and debugging (although today was 
made much easier by the same issue last week), I believe the issue can 
be worked around simply by wrapping the change to the property state (in 
the event callback) with a Platform.runLater(new Runnable() { ...}). 
This forces the second property update to happen after the first event 
has finished firing (at some point in the future).

However, this isn't a great solution - we're forcing the event to fire 
at a later date where the state may have already changed. The better 
solution, in my opinion, is to improve the event system such that it 
knows whether an event is already firing, and if so it will queue up the 
event to run after the current one has finished. I would be interested 
in hearing whether anyone else has encountered this kind of bug, or 
whether they have better suggestions.

You can see two examples of this bug in the code attached here (where 
the first example is for ComboBox where the value is updated in the 
onAction callback....which is called when value changes):

http://javafx-jira.kenai.com/browse/RT-22478
http://javafx-jira.kenai.com/browse/RT-17772

-- Jonathan


More information about the openjfx-dev mailing list