Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.gui > #4813
| From | Knute Johnson <nospam@knutejohnson.com> |
|---|---|
| Newsgroups | comp.lang.java.gui |
| Subject | Re: cleaning up very carefully |
| Date | 2011-12-07 06:31 -0800 |
| Organization | A noiseless patient Spider |
| Message-ID | <jbntbh$v86$1@dont-email.me> (permalink) |
| References | <cleaning-20111207080049@ram.dialup.fu-berlin.de> |
On 12/6/2011 11:24 PM, Stefan Ram wrote:
> Executive Summary of my question: Can you dispose a Swing
> GUI component (or all of the Swing GUI) while processing an
> event generated from this very GUI component?
>
> More elaborated:
>
> You all know
>
> frame.setDefaultCloseOperation( javax.swing.JFrame.EXIT_ON_CLOSE );
>
> , but I have found that the EDT (and thus the JVM) will also
> terminate once all disposable Swing components are disposed.
>
> So, when I get a »QUIT« command (i.e., from the application menu),
> I dispose all Swing components, and the application exits. I like
> this, because when I forget to dispose a single Swing component
> in my cleanup, this error will immediatly be observable, because
> in this case, the application will not exit anymore.
>
> Now, I had no idea, whether it is OK to dispose the whole view of
> the Swing application, including the JFrame and the very QUIT
> menu entry whose message I am just processing during the processing
> of the message from that menu entry itself. When I will return to
> Swing, will Swing be shocked to learn that the GUI component
> whose message was just being processed does not exist anymore?
> Does it need this component to finish the processing of an event
> that was created by this component. (After all, a reference to
> the component might still be contained in the event.)
>
> So I tried to be very careful and do one indirection as follows:
>
> if( message instanceof QuitMainCommand )
> { javax.swing.SwingUtilities.invokeLater
> ( new java.lang.Runnable()
> { public void run()
> { MainFrame.this.dispose(); }} ); }
>
> This is the code for the QUIT menu item. The »MainFrame.this.dispose()«
> will dispose the JFrame and the menu including the QUIT menu item, whose
> message I am just processing. Because, I do not know whether this is
> legal, I call my dispose code indirectly via invokeLater. But is this
> really necessary?
>
> BTW: I am aware that »instanceof« can be a code smell. I have designed
> a hierarchy of commands, and for the moment I am not aware of a better
> solution. I am (ab)using the Java class system to store a tree of
> commands, using »instanceof« to test for subentries of a tree.
>
There is nothing wrong with putting the dispose() in a Listener or some
method that is running on the EDT. The program won't stop until the EDT
has exited which it will do once it returns from the method.
--
Knute Johnson
Back to comp.lang.java.gui | Previous | Next | Find similar
Re: cleaning up very carefully Knute Johnson <nospam@knutejohnson.com> - 2011-12-07 06:31 -0800
csiph-web