2008-10-29 14 views
14

अगर मैं बनाने के इसमुख्य विंडो बंद करने के बाद भी मेरा एप्लिकेशन क्यों चल रहा है?

public static void main(String[] args) { 

    new JFrame().setVisible(true); 
} 

की तरह एक JFrame तो खिड़की appication बंद नहीं बंद करने के बाद (मैं इसे मारने के लिए की जरूरत है)।

एप्लिकेशन की मुख्य विंडो दिखाने का उचित तरीका क्या है?

मैं भी एक प्रस्तावित समाधान का कारण जानना चाहता हूं।

अग्रिम धन्यवाद।

उत्तर

20

आपको अपने जेएफआरएएम में setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); पर कॉल करना चाहिए।

उदाहरण कोड:

public static void main(String[] args) { 
    Runnable guiCreator = new Runnable() { 
     public void run() { 
      JFrame fenster = new JFrame("Hallo Welt mit Swing"); 
      fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      fenster.setVisible(true); 
     } 
    }; 
    SwingUtilities.invokeLater(guiCreator); 
} 
+1

मुझे कभी-कभी जावा से नफरत है।मेरी राय में यह डिफ़ॉल्ट व्यवहार होना चाहिए। –

+0

ठीक है मुझे कारण मिला - दो अतिरिक्त एडब्ल्यूटी थ्रेड चल रहे हैं और यही कारण है कि "मुख्य" विधि समाप्त होने पर मेरा एप्लिकेशन समाप्त नहीं होता है। मैं हमेशा भूल जाता हूं कि जेएफआरम गैर-मॉडल है और उन धागे बनाता है। –

+4

यह डिफ़ॉल्ट व्यवहार क्यों होना चाहिए? कई अनुप्रयोग कई खिड़कियां बनाते हैं। यदि वह डिफ़ॉल्ट था तो जब भी आप एक नई विंडो बनाते हैं तो आपको इसे बदलना होगा। – Herms

2

वहाँ आवेदन खिड़की और आवेदन ही ... खिड़की अपनी ही धागे में चलाता है के बीच एक अंतर है, और परिष्करण main() आवेदन अंत नहीं होगा यदि अन्य सूत्र अभी भी सक्रिय हैं । जब विंडो बंद करने तुम भी, अनुप्रयोग को बंद करने के लिए संभवतः, System.exit(0);

युवाल = 8)

3

आप फ्रेम निपटाने चाहिए बुला अपनी खिड़की श्रोता में निपटाने विधि लागू या setDefaultCloseOperation का उपयोग करके यह सुनिश्चित करना चाहिये। अंतिम के तर्क के लिए, आप दो विकल्पों का उपयोग कर सकते हैं:

DISPOSE_ON_CLOSE या EXIT_ON_CLOSE

DISPOSE_ON_CLOSE केवल फ्रेम संसाधनों का निपटान करें।

EXIT_ON_CLOSE फ्रेम संसाधनों का निपटान करता है और फिर System.exit का आह्वान करता है।

जब तक आपके पास कोई डिमन थ्रेड नहीं है तब तक दोनों के बीच कोई वास्तविक अंतर नहीं है। मैं DISPOSE_ON_CLOSE का उपयोग करना पसंद करता हूं क्योंकि इस तरह से मैं नोटिस कर सकता हूं कि क्या मैं थ्रेड को समाप्त करना भूल गया हूं, क्योंकि यदि कोई और थ्रेड चल रहा है तो JVM बंद हो जाएगा। बिना किसी निपटारे के फ्रेम को बंद करने का कारण भी एप्लिकेशन को समाप्त नहीं करेगा, क्योंकि स्विंग उन घटनाओं को संभालने के लिए एक थ्रेड बनाता है जो केवल तब ही समाप्त हो जाती है जब निपटान किया जाता है।

0

आप फ्रेम में विंडो श्रोता सेट कर सकते हैं ताकि प्रोग्राम इसे बंद करने के बाद समाप्त हो जाए।

 frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
    } 
0

यह करने के लिए सही तरीका (जब तक आप एक बहुत ही तुच्छ एकल खिड़की एप्लिकेशन लिख रहे हैं, यानी कोई अन्य विंडो या धागे आदि ..) है windowClosing() घटना को पकड़ने के लिए, और फिर dispose(); विधि कॉल फॉर्म का

यदि आपका प्रोग्राम इसके बाद पूरी तरह से बाहर नहीं निकलता है, तो इसका मतलब है कि आपके पास अन्य गैर-डीमॉन धागे चल रहे हैं, और आपको इन्हें अपने प्रोग्राम के आधार पर फिट करने के लिए सबसे अच्छा होना चाहिए।

कॉलिंग System.exit() या setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); किसी भी अन्य थ्रेड (और पूरे कार्यक्रम) को रोकने के लिए मजबूर होगा, जिसका अर्थ है कि आपका कोड कम पोर्टेबल है, और फोर्स-स्टॉपिंग थ्रेड स्पष्ट रूप से खतरनाक है (प्रोग्रामिंग के तरीके में)।

संबंधित मुद्दे