Why is windowClosed not being called, can someone tell me a little more about this?

I have a problem why the windowClosed method does not run in my test code, as shown below:

import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; public class Tmp { class TFrame extends JFrame{ private static final long serialVersionUID = -5729542298504858399L; public TFrame() { setTitle("title"); setSize(300, 300); } } public static void main(String[] args) { final TFrame t = new Tmp().new TFrame(); t.addWindowStateListener(new WindowAdapter() { @Override public void windowStateChanged(WindowEvent e) { super.windowStateChanged(e); System.out.println(e.getOldState() + "<-old new->" + e.getNewState()); } }); t.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { super.windowClosed(e); System.out.println(e.getID() + "closed " + e.getNewState()); } @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); System.out.println(e.getID() + "closing" + e.getNewState()); } }); t.setVisible(true); } } 

If I write the setDefaultCloseOperation statement (JFrame.DISPOSE_ON_CLOSE) or explicitly call dispose () on the TFrame, windowClosed () will be called.

Can anyone explain this in more detail, I am confused about what is a way to record listeners for windowClosed (), thanks in advance.

////////////////// updated in accordance with some Dan manuals //////////////

 import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JOptionPane; public class Tmp { class TFrame extends JFrame { // ignored ..... t.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { super.windowClosed(e); System.out.println(e.getID() + "closed " + e.getNewState()); } @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); System.out.println(e.getID() + "closing" + e.getNewState()); int quit = JOptionPane.showConfirmDialog(t, "Are you sure to quit?"); if(quit == JOptionPane.YES_OPTION){ t.dispose(); } else if (quit == JOptionPane.NO_OPTION){ t.setVisible(false); } } }); t.setVisible(true); t.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); } } 
+6
source share
1 answer

The default value for setDefaultCloseOperation is HIDE_ON_CLOSE . In this case, the window does not close, it is hidden.

By changing the value to something else, you actually get it, and not just hide it, so the event will be fired.

+7
source

All Articles