Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.gui > #4813

Re: cleaning up very carefully

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>

Show all headers | View raw


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


Thread

Re: cleaning up very carefully Knute Johnson <nospam@knutejohnson.com> - 2011-12-07 06:31 -0800

csiph-web