Re: File browser
Peter Duniho wrote:
On Tue, 05 Feb 2008 21:56:35 -0800, Lew <lew@lewscanon.com> wrote:
Running GUI events off the EDT is a known source of bugs. That's why
Sun now uses the word "must" with putting GUI events on the EDT.
You seem to be confusing the general issue of use of components with the
specific scenario I'm talking about: creating the components off the EDT.
No, I am speaking specifically of creating components off the EDT, and have
been for a couple of posts now.
I'm quite familiar with Google. I've been Googling Java issues for a month now.
But Google is not a great resource when one has already Googled and as a result of
failing to find sought-after information has posted a question to a newsgroup.
If Google fails you try searching within Sun's Java site or IBM DeveloperWorks
for Java questions. Five minutes on Sun turned up this gem:
<http://java.sun.com/developer/technicalArticles/javase/swingappfr/index.html>
You must create and initialize your GUI on the Swing event dispatch thread (EDT).
Many application developers forget this important step.
This article doesn't explain that as well as the JavaWorld article
RedGrittyBrick found but it should tip you off that there's something to this
matter.
Note that the article I found, and the JavaWorld article both date from
mid-2007. That is around the time the error in previous advice started
getting the publicity it deserved.
Here's an "Ask the Expert" from Sun's website:
<http://java.sun.com/developer/community/askxprt/2006/jl1016.html>
Until recently, the Swing claim was that GUIs could be constructed and accessed on any thread
up until the time that they were realized (a call to setVisible(true) realizes a frame and the
components it contains). After being realized, all GUI interaction would then need to happen
on the event dispatch thread (EDT). As such, calling setVisible(true) from the constructor
would simply mean that any further interaction with the component would have to occur on the EDT.
Recently, Swing has updated our policy to say that ALL Swing interaction must now be done on the
EDT for both unrealized and realized components. This includes GUI construction. When this policy
is followed, it makes absolutely no difference (from a safety perspective) where you call
setVisible(true). Please see the document How to Use Threads
<http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html>
for more information on threads and Swing.
That link throws back into the tutorial, which among other things states:
Why doesn't the initial thread simply create the GUI itself?
Because almost all code that creates or interacts with Swing components must run on the event
dispatch thread.
....
Programs that ignore this rule may function correctly most of the time, but are subject to
unpredictable errors that are difficult to reproduce.
Note that they say "creates ... Swing components".
That "difficult to reproduce" thing does not make the issue less valid, but it
might pose you difficulty in your quest for examples.
--
Lew