Reputation: 123
I have set up a JFrame like this:
public class XFrame extends JFrame {
public XFrame() {
setSize(100, 100);
}
@Override
public void dispose() {
super.dispose();
System.out.println("Dispose get called");
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
XFrame f = new XFrame();
f.setTitle("Hello World");
//f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.setVisible(true);
}
});
}
}
What I expect is that when I press the close button [X] then the dispose method will be called. However, it's the situation only when DISPOSE_ON_CLOSE is set as the DefaultCloseOperation (???). Java really surprises me here. How to implement a method that would be called in both case of DefaultCloseOperation value (DISPOSE_ON_CLOSE & EXIT_ON_CLOSE)?
Upvotes: 3
Views: 6300
Reputation: 247
Does it work if you put instead of EXIT_ON_CLOSE JFrame.EXIT_ON_CLOSE?
Upvotes: 0
Reputation: 29680
The documentation of dispose
does not mention that it get called when the system gets down. I think it's still not assured (by the javadoc) that it is called for DISPOSE_ON_EXIT
...
Anyway System.exit
, used by EXIT_ON_CLOSE
, is kind of brutal, it shutdowns the virtual machine and there is hardly any chance to run any method after that (despite some finalization hoocks and methods).
I personaly don't like to use EXIT_ON_CLOSE
because of that and because it's function can be inhibited by using an SecurityManager
Upvotes: 0
Reputation: 67750
If you do EXIT_ON_CLOSE
there's precious little need to dispose, as all resources are "disposed" anyway when the JVM exits. I'm putting "disposed" in quotes because in this automatic case, the dispose
method is apparently not being called.
Be aware that the public methods in Swing are there for you to call, not all are necessarily called by the innards of Swing. For example, there are setSize()
and setLocation()
and setBounds()
methods – do the former 2 call the latter, or the other way around? It's not defined, so you shouldn't assume.
Similarly, if you want to do something when the frame closes, the way to ensure it would be to hook a WindowListener
to the frame, and put your closing action in windowClosing()
.
Upvotes: 5
Reputation: 9426
Have you tried adding a WindowListener with the windowClosing() method implemented? That should tell you when it's either a dispose or an exit.
Edit: Just tried it out - should do the job, depending on whether or not you must do something in dispose() rather than in windowClosing().
Upvotes: 1