<Swing Dev> May Component.isFocusOwner() be called by non-edt threads?
    Artem Ananiev 
    artem.ananiev at oracle.com
       
    Tue Nov  1 13:30:14 UTC 2011
    
    
  
On 11/1/2011 4:56 PM, Christopher Deckers wrote:
> Pavel,
>
>> Of course all Swing methods (if javadoc doesn't say the opposite) must be
>> called from EDT thread.
>
> Which makes me remember that I recently received a bug report from
> someone using the Java Access Bridge (JAB).
>
> The bug is that JAB calls "Component.isFocusOwner()" outside of the
> EDT but my component enforces correct threading calls. Because the
> Javadoc does not say that it can be called from outside the EDT, I
> throw an exception on that call (or rather, in
> "Component.hasFocus()").
> I don't know much about JAB, but the user seemed to imply he did not
> create the JAB thread so I assume JAB did it.
>
> My question: is it allow to call "Component.isFocusOwner()" or
> "Component.hasFocus()" outside the EDT? If it is the case, shouldn't
> the Javadoc say so?
This is a gray area. Many Swing methods are actually inherited from AWT, 
which is a thread-safe library. However, some methods are overridden in 
JComponent and other classes, some methods can query other Swing 
objects, many actions can fire new events, etc. So would strongly 
recommend to access all the UI objects on EDT, event to call methods 
like isFocusOwner().
JavaDoc for Component.isFocusOwner() doesn't contain any threading 
notes, which is correct, as AWT is thread-safe. We can probably include 
the warnings to JComponent.isFocusOwner(), but... in this case we should 
override all the AWT methods and correct JavaDoc comments. Instead, we 
just say "Swing should be operated on EDT only" in a single place, and 
assume this statement is true for all the methods.
Thanks,
Artem
> Cheers,
> -Christopher
    
    
More information about the swing-dev
mailing list