2011-01-13 14 views
7

JLayeredPane लेयरिंग एक एक दूसरे के JLayeredPane.add(Component, Integer) का उपयोग कर के शीर्ष पर कई अवयव ढेर अनुमति देता है। निचले "परतों" में घटक के शीर्ष पर उच्च "परतें" डिस्प्ले में घटक प्रदर्शित होते हैं।JLayeredPane कंटेनर बनाम

Container.add(Component, int) एक समान तंत्र प्रदान करता है जिससे के साथ घटक इंडेक्स उच्च इंडेक्स वाले घटक के शीर्ष पर प्रदर्शित होते हैं।

कृपया ध्यान दें कि पहले तंत्र पूर्णांक का उपयोग करता है और दूसरा तंत्र पूर्णांक उपयोग करता है। इसके अलावा, एक निम्न के शीर्ष पर उच्च मूल्य प्रदान करता है, और दूसरा विपरीत करता है। मिश्रण दो :)

मेरा प्रश्न है नहीं है: JLayeredPane का उपयोग करते समय कंटेनर पहले से ही एक ही तंत्र प्रदान करता है की बात क्या है? क्या एक परत घटक दूसरे की तुलना में बेहतर है?

अद्यतन: विचार करने के लिए Container.setComponentZOrder(Component, int) भी है।

उत्तर

6

मेरे अपने प्रश्न का उत्तर देना:

Container.add(Component, int) और Container.setComponentZOrder(Component, int) लगभग समान हैं। पूर्व आमंत्रित करता है Nototify() जबकि उत्तरार्द्ध नहीं (प्रदर्शन कारणों के लिए)।

कंटेनर-लेयरिंग केवल तभी JComponent.isOptimizedDrawingEnabled() रिटर्न झूठी काम करता है। एक कार्यान्वयन जो झूठी वापसी के लिए होता है ... आप अनुमान लगाते हैं: JLayeredPane

कंटेनर-लेयरिंग का उपयोग करना निराश है क्योंकि इसमें unexpected side-effects हो सकता है।

अंत में, यह ध्यान देने योग्य बात यह है कि जब कंटेनर वाणी add(Component, int) यह वास्तव में ठीक से स्तरित घटकों रंग नहीं है लायक है। JComponent और इसके उप-वर्ग करते हैं।

एक और दिलचस्प खोज: रीपेंट() JLayeredPane के एक बच्चे पर आह्वान कभी नहीं। यह घटक को अपने जेड-ऑर्डर के बावजूद शीर्ष पर पेंट करने का कारण बन जाएगा। आपको केवल जेलायरपेन पर खुद को पेंट() को ही आमंत्रित करना चाहिए।

+0

रे "JLayeredPane के एक बच्चे पर रीपेंट() आह्वान कभी नहीं": मैं तुम्हारे साथ इस पाया बच्चे घटक किस प्रकार के बारे में उत्सुक हूँ। मैं [एक समान समस्या] में भाग गया (http://stackoverflow.com/questions/5668721/jmenuitems-painting-over-higher-components-in-jlayeredpane) और यह निर्धारित किया कि, मेरे मामले में कम से कम, यह एक मुद्दा था JMenuItems विशेष रूप से। वे व्यवहार करते हैं जैसे वे हमेशा शीर्ष पर होते हैं (जब तक कि वे पारदर्शी न हों)। –

+0

@Aaron, मुझे याद नहीं है कि मैंने किस घटक का उपयोग किया था, लेकिन जब आप इसके बारे में सोचते हैं तो यह समझ में आता है कि सभी घटक व्यवहार करेंगे वे हमेशा शीर्ष पर होते हैं। पेंट() यह मानने के लिए है कि आप क्लिप सीमाओं को वांछित सीमाओं के बाहर खींचने से रोकने के लिए सेट करेंगे। जब आप सीधे बच्चे के घटक (बिना सीमा के) पर repaint() का आह्वान करते हैं तो आप अनिवार्य रूप से इसके माता-पिता को अनदेखा करने के लिए कह रहे हैं। दूसरे शब्दों में, यह स्विंग कार्यान्वयन में एक बग नहीं है। यह उपयोगकर्ता त्रुटि है। – Gili

+0

असल में यह सही नहीं है। देखें [एडब्ल्यूटी और स्विंग में चित्रकारी] (http://java.sun.com/products/jfc/tsc/articles/painting/), विशेष रूप से पेंट प्रोसेसिंग अनुभाग।ऐसा नहीं है कि जब 'रीपेंट()' एक JComponent पर कहा जाता है, RepaintManager क्लिप आयत और घटक के 'opaque' और' isOptimizedDrawingEnabled' गुण 'जड़' घटक है जहाँ से रंग आपरेशन शुरू होगा निर्धारित करने के लिए उपयोग करता है कहा गया है। वास्तव में, अधिकांश घटक इस तरह व्यवहार नहीं करते हैं जैसे कि वे हमेशा शीर्ष पर होते हैं (यानी हमेशा के लिए हमेशा चालू नहीं होते हैं)। –

0

मेरा लेना यह है कि Container.add(Component,int) और JLayeredPane.add(Component,Integer) फ़ंक्शंस को एक निश्चित अनुक्रमणिका में घटक जोड़ा जा रहा है। यह तब सूचकांक है जो घटक के चित्रकला की स्थिति, लेआउट और क्रम को संभालने के लिए लेआउट प्रबंधकों द्वारा उपयोग किया जाता है। मुझे लगता है कि JLayeredPane.setLayer(Component c, int layer) उतना ही अधिक है जितना आप परतों के लिए देख रहे हैं। यह विशेष रूप से घटकों को परत करने के लिए बनाया गया है। बस मेरी दो समझ।

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