Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Swing and Threads

Reply
Thread Tools

Swing and Threads

 
 
electric sheep
Guest
Posts: n/a
 
      05-19-2004
o.k.

on the sun website they have these cryptic words:
To avoid the possibility of deadlock, you must take extreme care that
Swing components and models are created, modified, and queried only from
the event-dispatching thread.

and they give this sample code:
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});

my question is this.
"create and modify" means just that ... even creating.

i had thought of making a class, having it extend JFrame and implement
Runnable, like so:

class MyGUI extends JFrame implements Runnable {
MyGUI()
...

public void run()
...
}

then do:
javax.swing.SwingUtilities.invokeLater(new MyGUI());

but in fact, that wouldn't be following Sun's advice to the letter i
guess, would it ?

Because the JFrame object (MyGUI) would be created, and then the handle
to this object would be passed to invokeLater().
So in fact, part of the GUI would have already been created in the
"main" thread.

So I guess I need to create my MyGUI object from within a method, say
createGUI(), as opposed to "on-the-fly" like this ?
 
Reply With Quote
 
 
 
 
Chris Smith
Guest
Posts: n/a
 
      05-19-2004
electric sheep wrote:
> on the sun website they have these cryptic words:
> To avoid the possibility of deadlock, you must take extreme care that
> Swing components and models are created, modified, and queried only from
> the event-dispatching thread.
>
> and they give this sample code:
> javax.swing.SwingUtilities.invokeLater(new Runnable() {
> public void run() {
> createAndShowGUI();
> }
> });
>
> my question is this.
> "create and modify" means just that ... even creating.


Yes, apparently so. Initially, the advice from Sun was to avoid
accessing a component from the event dispatch thread after it's
realized. It seems Sun has recently begun advising to do all method
calls on GUI components in the event dispatch thread, however... even if
they do not have peers at the time.

I'm not aware of the precise motivation for this switch (i.e., I don't
know of a test case that fails when non-realized components are accessed
from a non-event thread.

--
www.designacourse.com
The Easiest Way to Train Anyone... Anywhere.

Chris Smith - Lead Software Developer/Technical Trainer
MindIQ Corporation
 
Reply With Quote
 
Steve W. Jackson
Guest
Posts: n/a
 
      05-19-2004
In article <eJOqc.4845372$>,
electric sheep <> wrote:

>.k.
>:
>n the sun website they have these cryptic words:
>:To avoid the possibility of deadlock, you must take extreme care that
>:Swing components and models are created, modified, and queried only from
>:the event-dispatching thread.
>:
>:and they give this sample code:
>: javax.swing.SwingUtilities.invokeLater(new Runnable() {
>: public void run() {
>: createAndShowGUI();
>: }
>: });
>:
>:my question is this.
>:"create and modify" means just that ... even creating.
>:
>:i had thought of making a class, having it extend JFrame and implement
>:Runnable, like so:
>:
>:class MyGUI extends JFrame implements Runnable {
>: MyGUI()
>: ...
>:
>: public void run()
>: ...
>:}
>:
>:then do:
>:javax.swing.SwingUtilities.invokeLater(new MyGUI());
>:
>:but in fact, that wouldn't be following Sun's advice to the letter i
>:guess, would it ?
>:
>:Because the JFrame object (MyGUI) would be created, and then the handle
>:to this object would be passed to invokeLater().
>:So in fact, part of the GUI would have already been created in the
>:"main" thread.
>:
>:So I guess I need to create my MyGUI object from within a method, say
>:createGUI(), as opposed to "on-the-fly" like this ?


If Sun's really saying "create and modify" then they're confusing the
issue more than is needed. It's perfectly OK to create GUI components
outside the EDT (as in JPanel panel = new JPanel(), for instance). What
you must not do is cause them to be shown, hidden, added to visible
components, or otherwise have their state changed in a way that would
result in painting and some other actions. So it's just fine to
instantiate your GUI class, but do NOT call pack, or setVisible(true),
or a variety of other things which cause the component hierarchy to be
"realized".

= Steve =
--
Steve W. Jackson
Montgomery, Alabama
 
Reply With Quote
 
Christophe Vanfleteren
Guest
Posts: n/a
 
      05-19-2004
Steve W. Jackson wrote:

> If Sun's really saying "create and modify" then they're confusing the
> issue more than is needed. It's perfectly OK to create GUI components
> outside the EDT (as in JPanel panel = new JPanel(), for instance). What
> you must not do is cause them to be shown, hidden, added to visible
> components, or otherwise have their state changed in a way that would
> result in painting and some other actions. So it's just fine to
> instantiate your GUI class, but do NOT call pack, or setVisible(true),
> or a variety of other things which cause the component hierarchy to be
> "realized".


They're saying this for a reason:

read
<http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html>
for the explanation.

--
Kind regards,
Christophe Vanfleteren
 
Reply With Quote
 
Steve W. Jackson
Guest
Posts: n/a
 
      05-19-2004
In article <grQqc.118044$>,
Christophe Vanfleteren <> wrote:

>:Steve W. Jackson wrote:
>:
>:> If Sun's really saying "create and modify" then they're confusing the
>:> issue more than is needed. It's perfectly OK to create GUI components
>:> outside the EDT (as in JPanel panel = new JPanel(), for instance). What
>:> you must not do is cause them to be shown, hidden, added to visible
>:> components, or otherwise have their state changed in a way that would
>:> result in painting and some other actions. So it's just fine to
>:> instantiate your GUI class, but do NOT call pack, or setVisible(true),
>:> or a variety of other things which cause the component hierarchy to be
>:> "realized".
>:
>:They're saying this for a reason:
>:
>:read
>:<http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html>
>:for the explanation.


I've already read that. And there's nothing in their so-called
explanation that indicates why creating components can be problematic so
long as nothing in the hierarchy has been realized. I have always
adhered to the rule that I build my component hierarchy completely but
never do anything else to it that's not on the EDT -- except once, when
I learned the hard way that I actually had displayed a JWindow on the
main thread.

= Steve =
--
Steve W. Jackson
Montgomery, Alabama
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are Off
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Swing is dead! Long live Swing. Knute Johnson Java 32 02-29-2012 04:10 PM
swing app using threads GX Java 2 12-08-2009 01:39 PM
Swing in different 2 threads dimitrik107@hotmail.com Java 4 09-15-2006 03:56 PM
Swing Model Classes Updating Swing Components on a Thread Other Than AWT mkrause Java 0 05-06-2005 04:32 PM
LINUX: Swing creates indestructible JFrame-threads tom baker Java 0 09-27-2004 09:33 AM



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57