2012-02-22 19 views
26

जावा स्विंग में paint(), paintComponent() और paintComponents() के बीच वास्तविक अंतर क्या है?स्विंग में पेंट, पेंट कॉम्पोनेंट और पेंट कॉम्पोनेंट्स के बीच अंतर

मैंने ओरेकल दस्तावेज़ों में जो समझाया, उसे समझने की कोशिश की लेकिन मैं स्पष्ट नहीं हूं।

उत्तर

33
  • एडब्ल्यूटी, paint() ओवरराइड करें।
  • स्विंग टॉप-स्तरीय कंटेनर (उदा। JApplet, JFrame, JWindow, JDialog ..), paint() ओवरराइड करें। लेकिन टीएलसी में पेंट करने के लिए पर कई अच्छे कारण नहीं हैं। एक अलग सवाल के लिए एक विषय, शायद।
  • शेष स्विंग, paintComponent() ओवरराइड करें।
  • न तो ओवरराइड करें और न ही स्पष्ट रूप से paintComponents() पर कॉल करें, इसे आवश्यकतानुसार कॉल करने के लिए इसे एपीआई पर छोड़ दें।

किसी विधि को ओवरराइड करते समय भी @Override नोटेशन का उपयोग करना सुनिश्चित करें।

ऐसा करने से में paintComponent(..) को ओवरराइड करने की समस्या पर संकेत मिलेगा (इसमें ऐसी कोई विधि नहीं है), जो देखने के लिए काफी आम है।

+0

हाय, कन्स्ट्रक्टर खत्म निष्पादन के तुरंत बाद पेंट() फ़ंक्शन को कॉल किया जाता है? – GMsoF

+0

या हमें मैन्युअल रूप से repaint() को कॉल करना होगा? – GMsoF

+1

@GMsoF 'repaint()' आवश्यक होने पर स्वचालित रूप से कॉल किया जाएगा। अगर एनिमेटिंग हो, तो इसे स्पष्ट रूप से भी कहा जा सकता है। यद्यपि बहुत बार कहा जाता है, बहुत जल्दी, और कुछ कॉलों को coalesced (अनदेखा) किया जाएगा। –

15

आप Painting in AWT and Swing

पढ़ने में रुचि हो सकती है एक उद्धरण:

नियम है कि AWT के हल्के घटकों भी लागू घटकों स्विंग करने के लिए लागू होते हैं - उदाहरण के लिए, रंग() कहा जाता हो जाता है जब यह समय आ गया है रेंडर करने के लिए - कि स्विंग आगे कारकों को छोड़कर paint() तीन अलग-अलग तरीकों, जो निम्नलिखित क्रम में लागू कर रहे हैं में फोन:

protected void paintComponent(Graphics g) 
protected void paintBorder(Graphics g) 
protected void paintChildren(Graphics g) 

स्विंग प्रोग्राम पेंट ओवरराइड करने के बजाय पेंट कॉम्पोनेंट() को ओवरराइड करना चाहिए। हालांकि एपीआई इसे अनुमति देता है, आमतौर पर पेंटबॉर्डर() या पेंट कॉम्पोनेंट्स() को ओवरराइड करने का कोई कारण नहीं है (और यदि आप करते हैं, तो सुनिश्चित करें कि आप जानते हैं कि आप क्या कर रहे हैं!)। यह फैक्टरिंग कार्यक्रमों के लिए केवल पेंटिंग के उस हिस्से को ओवरराइड करना आसान बनाता है जिसे उन्हें विस्तारित करने की आवश्यकता होती है। उदाहरण के लिए, इससे पहले उल्लिखित एडब्ल्यूटी समस्या हल होती है जहां super.paint() को आमंत्रित करने में विफलता ने हल्के वजन वाले बच्चों को दिखाई देने से रोका।

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