Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!gegeweb.org!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail From: Knute Johnson Newsgroups: comp.lang.java.gui Subject: Re: cleaning up very carefully Date: Wed, 07 Dec 2011 06:31:13 -0800 Organization: A noiseless patient Spider Lines: 57 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Wed, 7 Dec 2011 14:31:13 +0000 (UTC) Injection-Info: mx04.eternal-september.org; posting-host="mz/LDSJwiWnk3Jnnqg7x+Q"; logging-data="32006"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18EUKPKHSnLcE1uoU+CSGKi" User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20111105 Thunderbird/8.0 In-Reply-To: Cancel-Lock: sha1:39utCwRh3aBtWnEKMJU/FIHt+Bs= Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.gui:4813 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