2012-06-03 10 views
7

उपयोगकर्ता JFrame विंडो बंद करते समय अतिरिक्त संचालन कैसे शुरू करूं? मुझे मौजूदा धागे को रोकना है।जेएफआरएएम पर चल रहे थ्रेड को बंद करें

जैसा कि मैं इसे समझता हूं, setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); फ्रेम को बंद करने का कारण बनता है और इसके धागे को रोका जा सकता है। JFrame.EXIT_ON_CLOSE के बाद थ्रेड बंद होना चाहिए?

ग्राहक:

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

मैं सॉकेट धागा के साथ काम कर बंद करने के लिए की जरूरत है। ऐसा करने का सबसे अच्छा अभ्यास क्या है?

+1

देखें पर डिफ़ॉल्ट करीब आपरेशन सेट कर सकते हैं [* §12.8। कार्यक्रम निकास *] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.8)। – trashgod

उत्तर

10

JFrame.EXIT_ON_CLOSE का उपयोग वास्तव में JVM (System.exit) को समाप्त करता है। सभी चल रहे धागे स्वचालित रूप से बंद हो जाएंगे।

यदि आप JFrame बंद होने के बारे में कुछ कार्रवाई करना चाहते हैं, तो WindowListener का उपयोग करें।

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

यह सच है यदि उपयोगकर्ता JFrame के ऊपरी बाईं ओर विंडो बंद आइकन दबाता है, लेकिन यह सही नहीं है कि JFrame उस पर 'निपटान()' को कॉल करके बंद कर देता है, न कि गैर-डिमन थ्रेड चल रहा है। –

3
  • आप JFrame करने के लिए एक WindowListener जोड़ने के लिए।

  • windowClosing विधि के अंदर, आप आवश्यक कोड प्रदान कर सकते हैं।

उदाहरण के लिए:

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

तुम भी JFrame

JFrame frame = new JFrame("My Frame"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
संबंधित मुद्दे