2011-09-30 10 views
40

Parece que tengo el problema inverso para la mayoría de las personas. Tengo el siguiente código bastante estándar para ver si el usuario quiere hacer algunas paradas antes de cerrar la ventana:Java: cómo evito que WindowClosing cierre realmente la ventana

frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
    frame.addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent ev) { 
     boolean close = true; 
     // check some files, asking if the user wants to save 
     // YES and NO handle OK, but if the user hits Cancel on any file, 
     // I want to abort the close process  
     // So if any of them hit Cancel, I set "close" to false 
     if (close) { 
      frame.dispose(); 
      System.exit(0); 
     } 
     }    
}); 

No importa lo que intento, la ventana siempre se cierra cuando salgo de windowClosing. Cambiar WindowAdapter a WindowListener no hace ninguna diferencia. Lo que es extraño es que la documentación dice explícitamente "Si el programa no oculta o descarta explícitamente la ventana mientras se procesa este evento, la operación de cierre de la ventana se cancelará", pero no funciona de esa manera para mí. ¿Hay alguna otra forma de manejar la x en el marco? TIA

+3

Apuesto a que hay un error en algún lugar que será obvio para ti si simplificas tu problema tanto como sea posible creando un [sscce] (http://sscce.org). Si no se vuelve obvio, puede publicar el documento y podemos trabajar en él y poder ayudarlo mejor. –

+2

Según el código provisto, su lógica para establecer la variable 'close' probablemente sea incorrecta. Como su valor predeterminado es verdadero, parece que no lo restablece correctamente. ¿Imprimiste el valor antes de la declaración if? – camickr

+1

Acabo de encontrarme con otra situación que puede causar estos síntomas si utilizo Netbeans (8.0).El código generado automáticamente por Design View agregará su propia operación de cierre predeterminada, que puede anular el comportamiento especificado en el código generado por el ser humano. Esto se puede editar en el cuadro de propiedades de JDialog. (dejando este comentario para las generaciones futuras que buscan soluciones a problemas similares, a pesar de no ser la respuesta a la pregunta de Paul). –

Respuesta

59

acabo trató este caso prueba mínima:

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 
import javax.swing.WindowConstants; 

public class test { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent ev) { 
       //frame.dispose(); 
      } 
     }); 
     frame.setVisible(true); 

    } 

} 

Si sigo la llamada disponer comentó, y pulsa el botón de cierre, la ventana no sale. Descomenta eso y presiona el botón Cerrar, la ventana se cierra.

Tendría que adivinar que algo está mal en tu lógica para establecer tu variable "cercana". Intenta verificarlo dos veces.

+1

¡Gracias a todos! Lo encontré y de hecho fue mi problema. ¡Sabiendo que el caso simple funcionó ayudó mucho! –

+1

por favor, aprenda las convenciones de nomenclatura de Java y adhiérase a ellas - +1 para el caso de prueba más corto, aunque :-) – kleopatra

+1

Configurar la operación de cierre predeterminada fue clave para mí, como se detalla en la demostración anterior y se menciona en otras respuestas. – ajon

18

Esta es la clave, me parece: frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); Hace la diferencia en el caso de prueba que cociné.

+0

Esto fue clave para todo. EXIT_ON_CLOSE parece anular todas las cosas mencionadas en las otras respuestas. Gracias Ben! –

7
no

seguro de dónde está su problema,

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class ClosingFrame extends JFrame { 

    private JMenuBar MenuBar = new JMenuBar(); 
    private JFrame frame = new JFrame(); 
    private static final long serialVersionUID = 1L; 
    private JMenu File = new JMenu("File"); 
    private JMenuItem Exit = new JMenuItem("Exit"); 

    public ClosingFrame() { 
     File.add(Exit); 
     MenuBar.add(File); 
     Exit.addActionListener(new ExitListener()); 
     WindowListener exitListener = new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       int confirm = JOptionPane.showOptionDialog(frame, 
         "Are You Sure to Close this Application?", 
         "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
         JOptionPane.QUESTION_MESSAGE, null, null, null); 
       if (confirm == JOptionPane.YES_OPTION) { 
        System.exit(1); 
       } 
      } 
     }; 
     frame.addWindowListener(exitListener); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setJMenuBar(MenuBar); 
     frame.setPreferredSize(new Dimension(400, 300)); 
     frame.setLocation(100, 100); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private class ExitListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      int confirm = JOptionPane.showOptionDialog(frame, 
        "Are You Sure to Close this Application?", 
        "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, null, null); 
      if (confirm == JOptionPane.YES_OPTION) { 
       System.exit(1); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ClosingFrame cf = new ClosingFrame(); 
      } 
     }); 
    } 
} 
+5

No uses números mágicos. ¿Qué significa 'confirmar == 0'? De acuerdo, debería usar 'confirm == JOptionPane.YES_OPTION' para una mejor comprensión. – camickr

+2

está bien editado, gracias – mKorbel

4

Para el manejo de esta cosa hago:
Si el usuario selecciona sí, entonces utilizar setDefaultCloseOperation(DISPOSE_ON_CLOSE); dentro de las llaves de ese if else

si un cancelar se selecciona luego use setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Considere el ejemplo:

int safe = JOptionPane.showConfirmDialog(null, "titleDetails!", "title!!", JOptionPane.YES_NO_CANCEL_OPTION); 

if(safe == JOptionPane.YES_OPTION){ 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);//yes 

} else if (safe == JOptionPane.CANCEL_OPTION) { 
    setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);//cancel 
} else { 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);//no 
} 
+0

Esta solución realmente funciona. – karim

+0

Gracias @karim –

+0

gracias si pongo este código en el evento de cierre impedirá que el diálogo se cierre – Cherif

0

No estoy seguro de cuál es tu problema, pero esto funciona para mí.

frame.addWindowListener (nueva WindowAdapter() {

 public void windowClosing(WindowEvent evt){ 
         int res=JOptionPane.showConfirmDialog(null, 
           "Do you want to exit.?"); 
         if(res==JOptionPane.YES_OPTION){ 
           Cal.this.dispose(); 
         } 
     }        
    }); 
0

Para resolver el mismo problema que probé la primera respuesta de este artículo. Como aplicación independiente que funciona, pero no en mi caso. Tal vez la diferencia está en JFrame (en respuesta) y FrameView (mi caso).

método
public class MyApp extends SingleFrameApplication { // application class of my project 
    ... 
    protected static MyView mainForm; // main form of application 
    ... 
} 
public class MyView extends FrameView { 
    ... 
    //Adding this listener solves the problem. 
    MyApp.getInstance().addExitListener(new ExitListener() { 

     @Override 
     public boolean canExit(EventObject event) { 
     boolean res = false; 
     int reply = JOptionPane.showConfirmDialog(null, 
       "Are You sure?", "", JOptionPane.YES_NO_OPTION); 
     if (reply == JOptionPane.YES_OPTION) { 
      res = true; 
     } 
     return res; 
     } 
     @Override 
     public void willExit(EventObject event) { 
     } 
    }); 
    ... 
} 
1

setDefaultCloseOperation() ayuda en el problema. https://chortle.ccsu.edu/java5/Notes/chap56/ch56_9.html

ver este enlace

+0

Mientras que las respuestas de solo enlace son respuestas, es mejor poner la explicación en la respuesta y usar el enlace como referencia, ya que los enlaces pueden romperse – C8H10N4O2

Cuestiones relacionadas