2012-05-22 7 views
14

वहाँ StackOverflow जहां एक उपयोगकर्ता इस तरह एक प्रश्न पूछता पर कई बार किया गया है ...कार्डलेआउट बनाम जेपीएनल के मैन्युअल जोड़ने/हटाने के बारे में इतना खास क्या है?

मैं एक मुख्य JPanel कि एक बच्चे JPanel शामिल है। जब उपयोगकर्ता बटन पर क्लिक करता है, तो बच्चे JPanel को JPanel पर बदलना चाहिए। मैं इसे कैसे प्राप्त कर सकता हूं ।

अधिकतर नहीं, उपयोगकर्ता ने वास्तव में इस समस्या को लागू करने का प्रयास किया है, लेकिन यह काम नहीं कर सकता है।

जब भी मैं इस सवाल का जवाब है, मैं कुछ इस तरह (सीधे शब्दों में) करने के लिए उन्हें बता ...

JPanel myFrame = new JPanel(); 
myFrame.remove(oldPanel); 
myFrame.add(newPanel); 

मैं काफी एक वैध जवाब के रूप में देखते हैं, और मैं व्यक्तिगत रूप से के कई में इस का इस्तेमाल किया है समस्या के बिना मेरी अपनी जावा परियोजनाओं। हालांकि, मैं हमेशा अपने उत्तर के लिए डाउनवॉट प्राप्त करता हूं, और हर कोई बस कहता है "CardLayout का उपयोग करें"।

तो मेरा सवाल यह है कि, CardLayout के साथ सभी को इतनी मोहक क्यों है, जहां मेरा उत्तर डाउनवोट का हकदार है? मुझे ऊपर दिए गए कोड का उपयोग करके पैनल जोड़ने/हटाने के बजाय CardLayout का उपयोग क्यों करना चाहिए?

एक और प्रश्न के रूप में, क्या आप अभी भी गतिशील जेपीनेल वाले इंटरफेस के लिए CardLayout का सुझाव दे रहे हैं। उदाहरण के लिए, मेरे अधिकांश कार्यक्रम एक कस्टम प्लगइन ढांचे को लागू करते हैं जहां कई सैकड़ों JPanels हो सकते हैं, लेकिन मैं केवल पैनलों को लोड और प्रदर्शित करता हूं क्योंकि वास्तव में आवश्यक हैं। कार्यक्रम के सामान्य उपयोग के लिए, अधिकांश पैनल वास्तव में कभी लोड या आवश्यक नहीं होंगे। इस प्रकार के परिदृश्य के लिए, क्या मेरा कोडिंग दृष्टिकोण सबसे अच्छा समाधान होगा, क्योंकि मुझे लगता है कि CardLayout मुझे वास्तव में सभी JPanels बनाने की आवश्यकता होगी, भले ही अधिकांश का कभी भी उपयोग नहीं किया जाएगा?

+6

मुझे लगता है कि आपने रचनात्मक तरीके से अपने प्रश्न को phrasing करने के लिए एक अच्छी नौकरी की है। मुझे उम्मीद है कि यह बंद नहीं होगा। –

+0

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

+4

* "लेकिन मैं केवल पैनलों को लोड और प्रदर्शित करता हूं क्योंकि उन्हें वास्तव में आवश्यक है।" * आलसी तात्कालिकता का उपयोग 'कार्डलाउट' के साथ भी किया जा सकता है, और यह पैनलों के 1000s का समर्थन करता है। –

उत्तर

14
  • CardLayout के साथ, यह ढीला संयोजन (हालांकि अपने खुद के रोल के साथ असंभव नहीं)
  • CardLayout साथ
  • के लिए आसान है, कार्ड धारक का preferredSize सबसे बड़ा कार्ड यह धारण की है।
  • कार्डलाउट फर्क-अप करना कठिन है, और इसके छोटे से संगत घटक को next() और prev() विधियों को स्वैप करने की अनुमति देता है।
  • आप आसानी से वांछित घटक को स्थिर के साथ जोड़ सकते हैं - इस उद्देश्य के लिए Map<String, Component> बनाने की आवश्यकता नहीं है क्योंकि यह आपके लिए पहले से ही है। मैंने इसके लिए निरंतर उपयोग नहीं किया है।
  • घटकों को स्वैप करते समय repaint() और revalidate() पर कॉल करने की याद रखने की आवश्यकता नहीं है।
  • यह निर्मित और घटकों के आसान पुन: उपयोग के लिए अनुमति देता है।

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

+2

महान प्रतिक्रिया के लिए धन्यवाद, मुझे इनमें से कुछ बिंदुओं के बारे में आंत महसूस हो रहा था, और यह 'कार्डलाउट' का उपयोग करने के लिए कई अच्छे मामले प्रस्तुत करता है। – wattostudios

+2

संबंधित उदाहरण पाया जा सकता है [यहां] (http://stackoverflow.com/a/5655843/230513) और [यहां] (http://stackoverflow.com/a/6432291/230513)। – trashgod

+0

@ वाटटो: आपका स्वागत है! –

8

CardLayout का पूरी तरह से परीक्षण किया गया है और काम करने के लिए सिद्ध किया गया है। यह सही ढंग से component-tree lock प्राप्त करता है और यह सुनिश्चित करने के लिए घटक validation निष्पादित करता है कि कुछ भी गलत नहीं हो सकता है।आपका समाधान, जबकि यह ज्यादातर समय काम कर सकता है, कुछ परिस्थितियों में विफल हो जाएगा।

यह सब पहिया को पुनर्निर्मित करने के लिए उबलता है: आप ऐसा क्यों करना चाहते हैं जब ऐसी समय-परीक्षण कक्षा पहले से उपलब्ध हो?

+1

yup, अच्छी सलाह 1+ –

+1

यह आपके कुछ प्रतिक्रियाओं के लिए धन्यवाद, कुछ अच्छे अंक भी उठाता है। मैं निश्चित रूप से समझ सकता हूं कि इससे असफलताओं के खिलाफ कुछ आश्वासन प्रदान करने में मदद मिलेगी। पहिया को पुनर्निर्मित करने के संबंध में, मुझे लगता है कि यह मेरे लिए कभी नहीं हुआ कि 'कार्डलाउट' मेरे उद्देश्यों के लिए उपयुक्त होगा, और मैं जावा के निम्न स्तर पर टिंकरिंग की उचित मात्रा में हूं, इसलिए यह वास्तव में मेरे लिए एक बड़ी छलांग नहीं थी निम्न-स्तर 'जोड़ें() '/' निकालें() 'विकल्पों का उपयोग करने के लिए। अच्छे अंक के लिए धन्यवाद! – wattostudios

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