java - JPanel component draw order -


कृपया निम्न कोड देखें:

  आयात करें java.awt.Color; आयात करें java.awt.Dimension; आयात java.awt.Graphics; आयात करें java.awt.event.MouseAdapter; आयात करें java.awt.event.MouseEvent; आयात javax.swing.JFrame; आयात javax.swing.JPanel; सार्वजनिक वर्ग मुख्य {सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग [] आर्ग्स) {अंतिम जेफ्राम एफ = नया जेफ्राम ("एफू"); अंतिम जेपीनल सी = नया जेपीनल (नल); f.setContentPane (ग); C.setPreferredSize (नया आयाम (500,500)); अंतिम जेपैनेल ए = नया जेपीनल (नल) {@ ओवरराइड संरक्षित शून्य पेंट कॉमपोनेट (ग्राफ़िक्स जी) {जी। सैट रंग (रंग.रेड); G.fillRect (0, 0, getWidth (), getHeight ()); }}; a.setBounds (0,0,300,300); c.add (क); अंतिम जेपीनल बी = नया जेपीनल (नल) {@ ओवरराइड संरक्षित शून्य पेंट कॉमपोनेट (ग्राफ़िक्स जी) {जी। सीट रंग (रंगीन जीआरआई); G.fillRect (0, 0, getWidth (), getHeight ()); }}; b.setBounds (200,200,500,500); c.add (ख); C.setComponentZOrder (ए, 0); f.pack (); f.setVisible (सही); F.addMouseListener (नया माउस एडाप्टर () {@ ओवरराइड पब्लिक व्हॉयड माउसक्लाकेट (माउसईवेंट ई) {b.repaint ();}}); }}  

यह मूल रूप से सिर्फ तीसरे एक के ऊपर दो पैनल खींचता है: पैनल A, जो लाल है, और पैनल B, जो हरा है लाल पैनल ए में कम z- आदेश होता है और इसलिए पैनल बी पर चित्रित किया जाता है। अब अगर हम पैनल बी को खुद को फिर से रंगाने के लिए मजबूर करते हैं (केवल जेफ्राम पर क्लिक करें, दोनों पैनल ए और बी के बाहर), अचानक पैनल बी पर पेंट किया जाता है पैनल ए।

अगर मैं जेपीएनएलएल के बजाय जेसीमोनेंट का उपयोग करने पर स्विच करता हूं, यह सही तरीके से काम करता है और बी ए पर नहीं पेंट करेगा। ऐसा प्रतीत होता है कि जेपीएनएल सिर्फ जेड-ऑर्डर की उपेक्षा करता है इसलिए, समाधान के बजाय जेपीएनल के बजाय जेपीएमएनल का उपयोग करने के लिए समाधान लगता है बस जिज्ञासा से बाहर - क्या जेपी ऑर्डर जेपीएनएल के लिए सामान्य व्यवहार अनदेखी है?

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

आपका कोड लाल पैनल को खुद को फिर से रंगाने के लिए कह रहा है, ऐसा करता है। अब जेफ्राम के आकार को बदलने का प्रयास करें और पैनल पुन: पेंट करेंगे। इसका कारण यह है कि जेड-ऑर्डर केवल तभी लागू होता है जब पैरेंट पैनल अपने सभी बच्चों को पुनर्मुद्रित करता है। यही कारण है कि इस मामले में कचरा का समाधान काम करता है।

जेसीमांपेंट जिस तरह से व्यवहार करता है, वह इस वजह से व्यवहार करता है क्योंकि यह अपारदर्शी है, इसलिए जब भी उसे अपने माता-पिता की पृष्ठभूमि को दोबारा पेंट करने की जरूरत होती है पहले तो आप मूल पैनल के Z- आदेश में पेंटिंग को लागू करते हैं।

इसलिए दोनों के बीच का अंतर घटकों की अपारता है।


Comments

Popular posts from this blog

c# - sqlDecimal to decimal clr stored procedure Unable to cast object of type 'System.Data.SqlTypes.SqlDecimal' to type 'System.IConvertible' -

Calling GetGUIThreadInfo from Outlook VBA -

Obfuscating Python code? -