2012-03-20 7 views
23

मुझे कोई आधिकारिक दस्तावेज नहीं मिल रहा है जिसमें कहा गया है कि इवेंट डिस्पैच थ्रेड, ईडीटी की तुलना में Component.repaint को किसी अन्य थ्रेड से कॉल करना सुरक्षित है।EDT के बाहर Component.repaint() का उपयोग करने के लिए सुरक्षित?

क्या ऐसा है? और मुझे कुछ दस्तावेज/कोड कहां मिल सकता है?

+0

अच्छा सवाल +1, मेरे हेलीकाप्टर विचारों :-) हैं -> 'एक)' सब कुछ रीपेंट जब तक काम करता है () Thread.sleep (int), 'b) द्वारा लॉक नहीं किया गया है,' isEventDispatchThread() के बारे में कुछ विषय थे, लेकिन उन लिन्स लुप्तप्राय जावा.Net 'c) पर खो गए हैं 'एडब्ल्यूटी घटक के लिए एपीआई के साथ सहमत हैं और उनके लिए स्विंग – mKorbel

उत्तर

25

यहाँ एक quote from an official page कि बताते हुए है:repaint(), revalidate(), और invalidate():

निम्नलिखित JComponent तरीकों किसी भी धागे से कॉल करने के लिए सुरक्षित हैं। repaint() और revalidate() ईवेंट-प्रेषण धागे के क्रमशः paint() और validate() पर कॉल करने के लिए विधियों के कतार अनुरोध।

संपादित करें 1:


के बाद से पिछले लिंक उल्लेख स्थानांतरित कर दिया गया। मैं new link पोस्ट कर रहा हूं, हालांकि इस पृष्ठ की प्रामाणिकता को वास्तव में जानने में थोड़ा और समय लग सकता है, क्योंकि यह Java से प्रतीत होता है, हालांकि यह University के सर्वर से निकला है, जैसा कि पता बार से देखा जा सकता है।

7

यह थ्रेड-सुरक्षित है। RepaintManager यह सुनिश्चित करता है कि ऐसी कॉल इवेंट डिस्पैच थ्रेड में रखी गई हों।

Painting in AWT and Swing ("official" documentation)

स्विंग के RepaintManager वर्ग के उद्देश्य के एक स्विंग रोकथाम पदानुक्रम पर रीपेंट प्रसंस्करण के दक्षता को अधिकतम करने के लिए, और भी स्विंग की 'पुनर्वैधीकरण' तंत्र (उत्तरार्द्ध लागू करने के लिए एक विषय हो जाएगा एक अलग लेख के लिए)। यह स्विंग घटकों पर सभी पुनर्विचार अनुरोधों को रोककर लागू करता है (इसलिए वे अब एडब्ल्यूटी द्वारा संसाधित नहीं होते हैं) और को अपडेट करने की आवश्यकता है (जिसे "गंदे क्षेत्र" के रूप में जाना जाता है) पर अपना स्वयं का राज्य बनाए रखना है। अंत में, यह invokeLater() का उपयोग प्रेषण धागे पर लंबित अनुरोधों को संसाधित करने के लिए करता है, जैसा कि "प्रतिनिधि प्रोसेसिंग" (विकल्प बी) पर अनुभाग में वर्णित है।

अधिकांश कार्यक्रमों के लिए, RepaintManager को स्विंग के आंतरिक प्रणाली के हिस्से के रूप में देखा जा सकता है और इसे अनदेखा किया जा सकता है। हालांकि, इसका एपीआई प्रोग्रामिंग को चित्रों के कुछ पहलुओं पर बेहतर नियंत्रण प्राप्त करने का विकल्प प्रदान करता है।

+1

में घोंसला वाले वर्ग इस अद्भुत चित्रकारी दस्तावेज़ के लिए धन्यवाद, मुझे इस सामान की इतनी देर की आवश्यकता थी :-), बस इसे नहीं मिला। ऐसा लगता है कि मैं इसका इंतजार कर रहा था :-) –

+2

@ गगनदीपबाली: मैं भी इस पर भरोसा करता हूं। इसे खोजने का एक आसान तरीका ['घटक '] (http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html) एपीआई के माध्यम से है। – trashgod

3
इस मंच

(+1 दोनों answerers के लिए), लेकिन पर अनुभवों के बारे में

, मुझे लगता है कि आपके सवाल का सही ढंग से तरीकों का हिस्सा repaint() के लिए Graphics(2D) आवश्यक कॉल प्रोग्राम के उनमें से बाकी का जवाब दे,, इस पद्धति को लागू करने के लिए संभव नहीं लगता है (API में) सीधे

Swing JComponents के भाग के लिए हो सकता है असंतुष्ट सहमत होने के लिए बेहतर है (यकीन है कि उनमें से कुछ एपीआई में इस विधि लापता), इस मंच Concurency in Swing के बारे में सवाल से भरा है, Graphics(2D) के साथ शुरू सोचा JTextComponents, JTree, और समाप्त होता है setText() साथ (उसी तरह धागा सुरक्षित के रूप में घोषित किया जाता है),

के बारे में

Concurency in Swing सवालों का उल्लेखनीय संख्या

+1

एहह ........? प्रश्न का उत्तर स्पष्ट रूप से हां है - संभवतः _unrelated_ कोड – kleopatra

+0

का गलत व्यवहार करके पानी को गड़बड़ करने की कोई आवश्यकता नहीं है, मैं mkorbel के स्वस्थ संदेह का समर्थन करूंगा: 1) एपीआई [बदल सकते हैं] (http://stackoverflow.com/a/3245805/230513), हालांकि शायद 'repaint() 'नहीं। 2) जबकि 'repaint()' स्वयं थ्रेड-सुरक्षित है, एक आम तौर पर घटक को अद्यतन करने के बाद इसे कॉल करता है, जो _isn't_ थ्रेड-सुरक्षित नहीं है। – trashgod

+0

@trahgod अनुवाद के लिए धन्यवाद :-) हालांकि मैं थोड़ा असहमत हूं: ए) कोई बदलाव नहीं था, लेकिन एक डॉक्टर त्रुटि का एक फिक्स (तर्कसंगत रूप से वही बात, यह एक लंबी कहानी थी) बी) यदि हां, तो, कोड _before_ कॉलिंग पेंटेंट गलत है, न कि खुद को पश्चाताप करें – kleopatra