जावा स्विंग रिवाइडलेट () बनाम रिपेंट ()


211

मैं एक साथ एक स्विंग एप्लिकेशन डाल रहा हूं, जहां मैं अक्सर जेपीनेल की सामग्री को बदलना चाहता हूं। ऐसा करने के लिए, मैं कॉल कर रहा हूं removeAll(), फिर अपनी नई सामग्री जोड़ रहा हूं , फिर कॉल कर रहा हूं revalidate()

हालाँकि मुझे लग रहा है कि पुरानी सामग्री अभी भी दिखाई दे रही है (हालांकि नई सामग्री द्वारा अस्पष्ट)। यदि मैं repaint()इसके अतिरिक्त कॉल जोड़ता हूं revalidate(), तो यह अपेक्षित रूप से काम करता है।

मुझे यकीन है कि अन्य अवसरों पर मैंने अनुभव किया है कि बस कॉलिंग revalidate()पर्याप्त है।

तो मूल रूप से मेरा सवाल है - क्या मुझे दोनों कार्यों को कॉल करने की आवश्यकता है और यदि नहीं, तो मुझे उनमें से प्रत्येक को कब कॉल करना चाहिए?


6
ओरेकल के इस ट्यूटोरियल में कहा गया है: "हमेशा पुन: अमान्य होने के बाद निरस्त करें"। हालांकि कोई स्पष्टीकरण नहीं दिया गया है।
मिनट

जवाबों:


154

आप कॉल करने की आवश्यकता repaint()और revalidate()। पूर्व स्विंग को बताता है कि खिड़की का एक क्षेत्र गंदा है (जो हटाए गए पुराने बच्चों की छवि को मिटाने के लिए आवश्यक है removeAll()); उत्तरार्द्ध लेआउट प्रबंधक को लेआउट को पुनर्गणना करने के लिए कहता है (जो घटकों को जोड़ते समय आवश्यक है)। इससे पैनल के बच्चों को पुन: उत्पन्न होना चाहिए , लेकिन पैनल स्वयं ऐसा करने का कारण नहीं बन सकता है ( इसे पुनरावर्ती ट्रिगर्स की सूची के लिए देखें )।

अधिक सामान्य नोट पर: मूल पैनल का पुन: उपयोग करने के बजाय, मैं एक नया पैनल बनाने और माता-पिता पर उन्हें स्वैप करने की सलाह दूंगा।


1
क्या आप समझ सकते हैं कि पुराने पैनल के इस्तेमाल से नया पैनल बनाना बेहतर उपाय क्यों है? :)
आर्ट्टू

3
@Arttu - यह कम काम है, और इसलिए त्रुटियों की संभावना कम है।
kdgregory

86

जब भी आप कोई निष्कासन () या निष्कासन () करते हैं, आपको कॉल करना चाहिए

  validate();
  repaint();

आपके द्वारा नए घटकों को जोड़ने () को पूरा करने के बाद।

जब आप एक निष्कासन करते हैं, तो मान्य () या पुन: अमान्य () कॉल करना अनिवार्य है - संबंधित javadocs देखें।

मेरा स्वयं का परीक्षण इंगित करता है कि दमन () भी आवश्यक है। मुझे यकीन नहीं है कि ऐसा क्यों है।


59

revalidateएक बार नए घटकों को जोड़ने या हटाए गए पुराने को कंटेनर में कहा जाता है। यह कॉल नए घटक सूची के आधार पर लेआउट प्रबंधक को रीसेट करने के लिए कहने के लिए एक निर्देश है। revalidateघटक जो सोचता है कि 'गंदे क्षेत्र हैं' को पुन: पेश करने के लिए एक कॉल ट्रिगर करेगा। जाहिर है कि आपके JPanelद्वारा सभी क्षेत्रों को गंदा नहीं माना जाता है RepaintManager

repaintएक घटक को अपने आप को बताने के लिए उपयोग किया जाता है। यह अक्सर ऐसा होता है कि आपको इस तरह की परिस्थितियों को साफ करने के लिए इसे कॉल करने की आवश्यकता होती है।


5

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


-4

हाँ, आपको पुन: कॉल करने की आवश्यकता है (); दोबारा सत्यापित (); जब आप removeAll () को कॉल करते हैं तो आपको रिपेंट () और रिवाइडलेट () कॉल करना होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.