Search code examples
javaswingjdialogwindowlistener

No WindowEvent on closing a JDialog


I display a JDialog in a JFrame. This JDialog does nothing on dispose. I would like to catch the closing event and display a Popup but nothing happens.

I cannot find the bug. Could you tell me where the problem is?

Thanks a lot!

import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Window;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;


@SuppressWarnings("serial")
public class JFrameTest extends JFrame {

    public JFrameTest() {
        setLayout(new FlowLayout());
        setSize(300, 300);
        add(new JTextArea("This is a text"));
        setDefaultCloseOperation(JFrameTest.EXIT_ON_CLOSE);
        getContentPane().setPreferredSize(getSize());
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
        JDialogTest dialog = new JDialogTest(this, Dialog.ModalityType.APPLICATION_MODAL);
        dialog.setVisible(true);
    }

    public static void main(String[] args) {
        new JFrameTest();
    }

    private class JDialogTest extends JDialog implements WindowListener {

        public JDialogTest(Window parent, ModalityType modalityType) {
            super(parent, modalityType);

            setLayout(new FlowLayout());
            add(new JLabel("This is another text"));
            setSize(200, 50);

            setDefaultCloseOperation(JDialogTest.DO_NOTHING_ON_CLOSE);
            setLocationRelativeTo(null);
            getContentPane().setPreferredSize(getSize());
            pack();
            setVisible(true);
        }

        @Override
        public void windowActivated(WindowEvent e) {}

        @Override
        public void windowClosed(WindowEvent e) {}

        @Override
        public void windowClosing(WindowEvent e) {
            JOptionPane.showMessageDialog(this, "A popup message!");
        }

        @Override
        public void windowDeactivated(WindowEvent e) {}

        @Override
        public void windowDeiconified(WindowEvent e) {}

        @Override
        public void windowIconified(WindowEvent e) {}

        @Override
        public void windowOpened(WindowEvent e) {}
    }
}

Solution

  • You forgot to addWindowListener to your JDialogTest class, to catch the WINDOW CLOSING event. Something like this :

    addWindowListener(this);
    

    Moreover you are calling setVisible(true) once inside your JDialogTest class and the other time while creating an object of JDialogTest class inside the JFrameTest class.

    Please never use any setXXXSize(...) method in Swing, let Layout Manager worry about that part. Moreover, it will be wise if you use setLocationByPlatform(true) instead of setLocationRelativeTo(null). A very good example as to why former should be used instead of the latter is given by @Andrew Thompson, in this Thread for How to best position Swing GUI's