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