2011-10-21 20 views
6

tengo una clase que se extiende FilePathDialog JDialog y que la clase que se está llamando desde alguna clase X. Aquí es un método en la clase Xespera para JDialog para cerrar

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 nunca se llama cuando se cierra la ventana JDialog . Todo lo que trato de hacer es esperar a que el JDialog se cierre antes de continuar con el método. También intenté usar SwingWorker y Runnable pero eso no ayudó.

+1

¿Es un cuadro de diálogo modal? Si es así, no agregaría un oyente de ventana, especialmente después de que el diálogo se haga visible. En cambio, se ha tratado el diálogo cuando se alcanza la línea después de 'projectDialog.setVisible (true);'. –

+0

¿Intentó agregar el oyente antes de hacer visible la ventana? –

+0

Esto no debería importar. Si se trata de un diálogo modal (que es lo que está aludiendo), el código se reanudará justo después de setVisible (verdadero), por lo que no habría necesidad de un oyente. Si se trata de un diálogo no modal, el oyente funcionará independientemente de cuándo se agregue. –

Respuesta

16

De nuevo, la clave es es el diálogo modal o no?

Si es modal, entonces no hay necesidad de un WindowListener ya que sabrá que el diálogo se ha tratado ya que el código se reanudará inmediatamente debajo de su llamada al setVisible(true) en el cuadro de diálogo. es decir, esto debería funcionar:

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

Si por el contrario es el modo de menos, entonces un WindowListener debería funcionar, y lo más probable es que tienes otro problema en el código no se muestra aquí, y usted querrá para publicar un sscce para analizar, ejecutar y modificar.

Editar para gpeche
Por favor, echa un vistazo a este SSCCE que muestra que los 3 tipos de parámetros de cierre por defecto activarán la ventana oyente:

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); 
    } 
} 
3

Javadoc para WindowListener.windowClosed():

Se invoca cuando un la ventana se ha cerrado como resultado de llamar al , disponer en la ventana.

Y para JDialog.setDefaultCloseOperation():

Establece la operación que va a pasar por defecto cuando el usuario inicia una "estrecha" en este diálogo. Las opciones posibles son:

  • DO_NOTHING_ON_CLOSE - no hacen nada - requieren el programa para manejar la operación en el método windowClosing de un objeto WindowListener registrado.
  • HIDE_ON_CLOSE - ocultar automáticamente el cuadro de diálogo después de invocar cualquier WindowListener registrada objetos
  • DISPOSE_ON_CLOSE - ocultar de forma automática y disponer el cuadro de diálogo después de invocar cualquier WindowListener registrada objetos

El valor se establece en HIDE_ON_CLOSE por defecto.

Eso sugiere que debe llamar al projectDialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); después de instanciar FilePathDialog.

+0

Todos los tipos de cierre predeterminados enumerados anteriormente activarán los métodos windowClosing o windowClosed o ambos en el WindowListener. Por favor vea mi respuesta para un SSCCE que demuestra que esto es así. –

+0

@Hovercraft Full Of Eels oh sí, no vi la llamada a 'doWork()' dentro de 'windowClosing()' – gpeche

2

respuesta a su pregunta

añadir WindowListener a su JDialog (JDialog.DO_NOTHING_ON_CLOSE), en windowClosing evento para tratar de ejecutar el código, si termina con éxito, entonces llaman dispose() o setVisible(false)

yo no estaba de acuerdo con su idea, otra solución

crear sólo un JDialog (JDialog.DO_NOTHING_ON_CLOSE) con WindowListener y reutilización para otro Action, la acción final será siempre setVisible(false), si su código finaliza con éxito, elimine el o los hijos de JDialog, su JDialog está preparado para otro trabajo

Cuestiones relacionadas