Search code examples
javaswingjdialog

wait for jdialog to close


I have a class FilePathDialog which extends JDialog and that class is being called from some class X. Here is a method in class X

    projectDialog = new FilePathDialog();   
    projectDialog.setVisible(true);

    projectDialog.addWindowListener(new WindowAdapter() {            
        public void windowClosing(WindowEvent e) {
            System.out.println("Window closing");
            try {
                doWork();
            } catch (Throwable t) {
                t.printStackTrace();
            }                
        }

        public void windowClosed(WindowEvent e) {
            System.out.println("Window closed");
            try {
                doWork();
            } catch (Throwable t) {
                t.printStackTrace();
            }                
        }
    });     

doWork never gets called when the JDialog window closes. All I'm trying to do is wait for the JDialog to close before it proceeds in the method. I also tried using SwingWorker and Runnable but that did not help.


Solution

  • Again, the key is is the dialog modal or not?

    If it's modal, then there's no need for a WindowListener as you will know that the dialog has been dealt with since code will resume immediately below your call to setVisible(true) on the dialog. i.e., this should work:

    projectDialog = new FilePathDialog();   
    projectDialog.setVisible(true);
    doWork(); // will not be called until the dialog is no longer visible
    

    If on the other hand it's mode-less, then a WindowListener should work, and you've likely got another problem in code not shown here, and you'll want to post an sscce for us to analyze, run, and modify.

    Edit for gpeche
    Please check out this SSCCE that shows that the 3 types of default closing parameters will trigger the window listener:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class DialogClosing {
       private static void createAndShowGui() {
          JFrame frame = new JFrame("DialogClosing");
    
          JPanel mainPanel = new JPanel();
          mainPanel.add(new JButton(new MyAction(frame, JDialog.DISPOSE_ON_CLOSE, "DISPOSE_ON_CLOSE")));
          mainPanel.add(new JButton(new MyAction(frame, JDialog.HIDE_ON_CLOSE, "HIDE_ON_CLOSE")));
          mainPanel.add(new JButton(new MyAction(frame, JDialog.DO_NOTHING_ON_CLOSE, "DO_NOTHING_ON_CLOSE")));
    
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    
    class MyAction extends AbstractAction {
       private JDialog dialog;
       private String title;
    
       public MyAction(JFrame frame, int defaultCloseOp, final String title) {
          super(title);
          dialog = new JDialog(frame, title, false);
          dialog.setDefaultCloseOperation(defaultCloseOp);
          dialog.setPreferredSize(new Dimension(300, 200));
          dialog.pack();
          dialog.addWindowListener(new WindowAdapter() {
             @Override
             public void windowClosed(WindowEvent e) {
                System.out.println(title + " window closed");
             }
             @Override
             public void windowClosing(WindowEvent e) {
                System.out.println(title + " window closing");
             }
          });
    
          this.title = title;
       }
    
       @Override
       public void actionPerformed(ActionEvent arg0) {
          dialog.setVisible(true);
       }
    }