2012-06-03 30 views
7

¿Cómo invoco operaciones adicionales cuando el usuario cierra una ventana JFrame? Debo detener los hilos existentesTerminar ejecución de subprocesos en JFrame cerrar

Según tengo entendido, setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); hace que el marco se cierre y se detenga su rosca. ¿Deben cerrarse los hilos después de JFrame.EXIT_ON_CLOSE?

Cliente:

static boolean TERMINATE = false; 
public static void main(String[] args) { 
// some threads created 
while(true) { 

       if(TERMINATE){ 
         // do before frame closed 
        break; 
         } 
       } 

} 
    private static JPanel startGUI(){ 
      JFrame f = new JFrame(); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      JPanel gui = new JPanel(); 
      f.add(gui); 
      f.setSize(500,500); 
      f.setVisible(true); 
      return gui; 
     } 

Necesito cerrar tomas el hilo de trabajo con. ¿Cuál es la mejor práctica para hacer eso?

+1

Véase también [* §12.8. Salida del programa *] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.8). – trashgod

Respuesta

10

El uso de JFrame.EXIT_ON_CLOSE termina realmente la JVM (System.exit). Todos los hilos en ejecución se detendrán automáticamente.

Si desea realizar alguna acción cuando un JFrame está a punto de cerrarse, use un WindowListener.

JFrame frame = ... 
frame.addWindowListener(new WindowAdapter() { 
    @Override 
    public void windowClosing(WindowEvent e) { 
     // close sockets, etc 
    } 
}); 
+2

Esto es cierto si el usuario presiona el ícono de cerrar ventana en la parte superior izquierda del JFrame, pero no es verdadero si el JFrame se cierra al invocar 'disponer() ', no si se está ejecutando un subproceso no-demonio. –

3
  • hay que añadir un WindowListener a la JFrame.

  • Dentro del método windowClosing, puede proporcionar el código requerido.

Por ejemplo:

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 == 0) { 
        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 == 0) { 
       System.exit(1); 
      } 
     } 
    } 

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

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

Es posible ajustar la operación de cierre por defecto en el JFrame

JFrame frame = new JFrame("My Frame"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
Cuestiones relacionadas