2012-06-03 9 views
7

Come posso richiamare operazioni extra quando l'utente chiude una finestra JFrame? Devo interrompere i thread esistenti.Terminare i thread in esecuzione su JFrame close

Come ho capito, setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); causa la chiusura del frame e il suo thread da arrestare. I thread dovrebbero essere chiusi dopo lo 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; 
     } 

ho bisogno di chiudere le prese il filo del lavoro con. Qual è la migliore pratica per farlo?

+1

Vedi anche [* §12.8. Uscita programma *] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.8). – trashgod

risposta

10

L'utilizzo di JFrame.EXIT_ON_CLOSE termina effettivamente la JVM (System.exit). Tutti i thread in esecuzione verranno automaticamente arrestati.

Se si desidera eseguire un'azione quando si sta per chiudere JFrame, utilizzare WindowListener.

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

Questo è vero se l'utente preme l'icona di chiusura della finestra in alto a sinistra di JFrame, ma non è true se il JFrame si chiude chiamando 'dispose()' su di esso, non se è in esecuzione un thread non daemon. –

3
  • si deve aggiungere un WindowListener al JFrame.

  • All'interno del metodo windowClosing, è possibile fornire il codice richiesto.

Ad esempio:

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

È possibile impostare l'operazione di chiusura di default sul JFrame

JFrame frame = new JFrame("My Frame"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
Problemi correlati