2009-07-08 8 views
191

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

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

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

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

+5

[ओरेकल से यह ट्यूटोरियल] (http://docs.oracle.com/javase/tutorial/uiswing/components/jcomponent।एचटीएमएल # custompaintingapi) कहता है: "हमेशा पुनर्मूल्यांकन के बाद पश्चाताप का आह्वान करें"। यद्यपि कोई स्पष्टीकरण प्रदान नहीं किया गया है। – mins

उत्तर

140

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

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

+1

क्या आप तर्कसंगत हो सकते हैं कि एक नया पैनल क्यों बनाना पुराने का उपयोग करने से बेहतर समाधान है? :) – Arttu

+2

@ आर्टू - यह कम काम है, और इसलिए त्रुटियों से कम प्रवण है। – kdgregory

55

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

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

79

आप एक निकालें() या एक removeAll() करना किसी भी समय, आप के बाद आप ऐड पूरा कर लिया है बुलाना चाहिए

validate(); 
    repaint(); 

() 'नए घटकों ing।

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

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

-4

हाँ आपको repaint() को कॉल करने की आवश्यकता है; पुनर्मूल्यांकन(); जब आप removeAll() फोन तो आप रीपेंट() कहते हैं और दोबारा सत्यापित()

+9

और यह स्वीकार्य उत्तर से अलग कैसे है? – William

1

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

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