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