यह उन प्रश्नों में से एक है जो मुझे खुश करते हैं मैंने Robinson & Vorobiev's book on Swing खरीदा।
कुछ भी है कि एक java.awt.Component
के राज्य तक पहुँचता तीन अपवादों के साथ, EDT अंदर चलाने की जानी चाहिए: कुछ भी विशेष रूप से धागे की सुरक्षित के रूप में दस्तावेज, इस तरह के repaint()
, revalidate()
, और invalidate()
के रूप में; यूआई में कोई भी घटक जो अभी तक नहीं हुआ है; और ऐप्पल के start()
से पहले एप्पल में किसी भी घटक को बुलाया गया है।
विशेष रूप से थ्रेड-सुरक्षित किए गए तरीके इतने असामान्य हैं कि अक्सर उन लोगों को याद रखने के लिए पर्याप्त होता है; आप आमतौर पर यह मानने से दूर हो सकते हैं कि ऐसी कोई विधि नहीं है (उदाहरण के लिए, स्विंगवर्कर में एक पुनर्निर्मित कॉल को लपेटना पूरी तरह से सुरक्षित है)।
एहसास मतलब यह है कि घटक है या तो एक उच्च-स्तरीय कंटेनर (JFrame की तरह) जो setVisible(true)
, show()
, या pack()
में से किसी पर बुलाया गया है, या यह एक एहसास हुआ घटक में जोड़ा गया है। इसका मतलब यह है कि मुख्य() विधि में अपना यूआई बनाने के लिए यह बिल्कुल ठीक है, क्योंकि कई ट्यूटोरियल उदाहरण करते हैं, क्योंकि वे शीर्ष-स्तरीय कंटेनर पर setVisible(true)
पर कॉल नहीं करते हैं जब तक कि प्रत्येक घटक इसमें जोड़ा नहीं जाता है, फोंट और सीमाएं कॉन्फ़िगर की गई हैं, आदि।
इसी कारण से, अपने एप्लेट यूआई को init()
विधि में बनाने के लिए पूरी तरह से सुरक्षित है, और उसके बाद start()
को सभी निर्मित होने के बाद कॉल करें।
invokeLater()
को भेजने के लिए Runnables में बाद में घटक परिवर्तनों को लपेटना इसे केवल कुछ बार करने के बाद सही हो जाता है। एक चीज जो मुझे परेशान करती है वह एक घटक की स्थिति पढ़ती है (कहें, someTextField.getText()
) किसी अन्य थ्रेड से। तकनीकी रूप से, इसे invokeLater()
में भी लपेटा जाना है; व्यावहारिक रूप से, यह कोड को बदसूरत तेज़ बना सकता है, और मैं अक्सर परेशान नहीं करता हूं, या मैं उस जानकारी को प्रारंभिक घटना हैंडलिंग समय पर पकड़ने के लिए सावधान हूं (आमतौर पर वैसे भी अधिकांश मामलों में इसे करने का सही समय)।
स्रोत
2008-10-08 21:28:46
एक invokeAndWait() विधि भी है, लेकिन जब भी संभव हो invocLater() का उपयोग करें। – Powerlord
यदि आप डेडलॉक्स चाहते हैं तो invokeAndWait का उपयोग करें। ;) –
या घंटे के हिसाब से भुगतान किया जाता है। :-) –