2010-06-12 15 views
17

आप स्विंग में एक संवाद को खोलते हैं, उदाहरण के लिए एक JFileChooser, यह कुछ हद तक इस स्यूडोकोड प्रकार है:स्विंग संवाद कैसे काम कर सकते हैं?

swing event thread { 
    create dialog 
    add listener to dialog close event { 
    returnValue = somethingFromDialog 
    } 
    show dialog 
    (wait until it is closed) 
    return returnValue 
}

मेरे सवाल यह है: यह कैसे संभवतः काम कर सकते हैं? जैसा कि आप देख सकते हैं कि संवाद बंद होने तक लौटने की प्रतीक्षा करता है। इसका मतलब है स्विंग घटना धागा अवरुद्ध है। फिर भी, कोई संवाद के साथ बातचीत कर सकता है, जिसे AFAIK को इस थ्रेड को चलाने की आवश्यकता है।

तो यह कैसे काम करता है?

उत्तर

6

यह एडब्ल्यूटी का धागा है, स्विंग नहीं।

वैसे भी, एडब्ल्यूटी show के भीतर प्रेषण लूप चलाता है। अवरुद्ध खिड़कियों के लिए इनपुट घटनाओं को अवरुद्ध कर रहे हैं। घटनाओं को दोबारा शुरू करें, खिड़कियों और सामान्य घटनाओं को अनब्लॉक करने की घटनाएं सामान्य रूप से भेजी जाती हैं।

आप यह देख सकते या तो पंक्ति जोड़कर:

Thread.dumpStack(); 
भी मॉडल संवाद के लिए, और अधिक आसानी से कमांड लाइन से jstack साथ पकड़ कर या या के कमांड विंडो में ctrl-\/ ctrl-break का उपयोग में

आवेदन।

Foxtrot लाइब्रेरी इसे अधिक प्रक्रियात्मक (घटना-संचालित के विपरीत) मॉडल प्रदान करने के लिए दुर्व्यवहार करता है। यह वेबस्टार्ट/जावा प्लगइन द्वारा जेएनएलपी सेवाओं और अन्य लोगों के लिए संवाद प्रदान करने के लिए भी उपयोग किया जाता है जब एप्लिकेशन ईडीटी से बुलाया जाता है।

9

मौजूदा ईवेंट प्रेषण धागा अवरुद्ध है, और इसलिए स्विंग घटनाओं को पंप करने वाला एक और धागा बनाता है। यह तब संवाद की अवधि के लिए घटना प्रेषण धागा है।

स्विंग देशी ओएस विंडो संदेशों को पंप करने के लिए एक अलग देशी धागा बनाता है। यह एडब्ल्यूटी घटना धागे से अलग है।

Windows पर, जैसा कि आप देख इन धागे

"AWT-Windows" - the native UI thread 
    "AWT-EventQueue-0" - the current AWT event dispatch thread 

संपादित करें: downvote सही है। यह सच नहीं है, कम से कम सभी मामलों में नहीं।

मॉडल संवाद अक्सर एडब्ल्यूटी कार्यक्रमों को पंप करने का ख्याल रखते हैं। यदि आप कोड

SwingUtilities.invokeAndWait(new Runnable() 
{ 
    public void run() 
    { 
     JOptionPane.showInputDialog("hello"); 
    } 
}); 

और फिर थ्रेड को देखते हुए तोड़ें, तो आप केवल एक EventQueue थ्रेड देखेंगे। जॉप्शनपेन पंप घटनाओं की शो() विधि स्वयं ही होती है।

फ्रेमवर्क जैसे Spin और फॉक्सट्रॉट एक ही दृष्टिकोण लेते हैं - वे आपको ईडीटी पर एक लंबी चल रही अवरोध विधि बनाने की अनुमति देते हैं, लेकिन घटनाओं को स्वयं पंप करके घटनाओं को बहते रहते हैं। स्विंग के लिए एकाधिक प्रेषण धागे होने के लिए संभव है (मुझे यकीन है कि स्विंग के पुराने संस्करणों के साथ यह मामला था) लेकिन अब यह मल्टीकोर सामान्य है, समेकन के मुद्दों, विशेष रूप से एक थ्रेड पर परिवर्तन सुनिश्चित करने के लिए अन्य धागे पर सही ढंग से प्रकाशित किया जाता है, इसका मतलब है कि कई ईडीटी का उपयोग मौजूदा कार्यान्वयन में बग पैदा करता है। Multiple Swing event-dispatch threads

+0

जो चीजों को समझाता है। आपके उत्तर को ऊपर उठाया लेकिन किसी और ने दोनों को नीचे गिरा दिया: -/ –

+0

मैंने इसे घटा दिया क्योंकि यह सच नहीं है। –

+0

डाउनवोट सही है - मैंने अपनी प्रतिक्रिया अपडेट की है। – mdma

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