Dealing with nested events for a single property in JavaFX

Jonathan Giles jonathan.giles at oracle.com
Thu Jun 21 15:39:30 PDT 2012


runLater is wrong more often than it is right - so you're right - I 
don't think we should consider that approach (or requiring people to 
have to know to do this)

Saying that you should error out when someone tries to update a property 
in the event callback is also wrong, I think. There are legitimate use 
cases, for example as a last ditch form of validation: if the value is 
outside the allowable range, change it back to something that is valid. 
Alternatively, when focus is given to a node, request a focus change on 
another node. I imagine our own code would blow up if we took this 
approach :-)

-- Jonathan

On 22/06/2012 10:31 a.m., Daniel Zwolenski wrote:
> Similar to the ConcurrentModification thing you get with Collections 
> right? Could it be handled in a similar way, i.e. throw an error if 
> someone tries to update the property they are modifying while in the 
> update callback for that property? As you say, it's user error, so 
> slapping them on the wrists is ok.
>
> The runLater one feels like it could cause its own problems to me. The 
> 'single' threadedness of JFX is part of it's design. It gives me 
> deterministic behaviour, this feels like it could open up small cracks 
> in that. Obviously we wouldn't get concurrency/deadlock issues but I 
> suspect we could get things in a non-deterministic order as a result 
> of this (e.g. if another thread does a runLater somewhere else in the 
> code at the same time this runLater is being added). Could end up that 
> my property change is overwritten sometimes but not others, etc (I'm 
> going more off gut feel here though than concrete examples).
>
>
> On Fri, Jun 22, 2012 at 8:20 AM, Jonathan Giles 
> <jonathan.giles at oracle.com <mailto:jonathan.giles at oracle.com>> wrote:
>
>     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