2009-05-23 15 views
9

मुझे लगता है कि अधिकांश जावा कोड पेंट या पेंट को ओवरराइट करने के लिए कॉम्पोनेंट है, उनमें से अधिकतर ग्राफिक्स ऑब्जेक्ट को पुराने ग्राफिक्स ऑब्जेक्ट को पुनर्स्थापित नहीं करते हैं, ग्राफिक्स की स्थिति बदलने के बाद वस्तु। उदाहरण के लिए, setStroke, setRenderingHint ...ग्राफिक्स मूल स्थिति को पुनर्स्थापित करने की आवश्यकता जब पेंट या पेंट ओवरराइट किया गया कॉम्पोनेंट

मैं सोच रहा था कि यह एक अच्छा अभ्यास है कि हम विधि से लौटने से पहले, ग्राफिक्स ऑब्जेक्ट की पुरानी स्थिति को पुनर्स्थापित करते हैं। उदाहरण के लिए

public void paintComponent(Graphics g) { 
    super.paintComponet(g); 
    Stroke oldStroke = g.getStroke(); 
    g.setStroke(newStroke); 
    // Do drawing operation. 
    g.setStroke(oldStroke); 
} 

क्या यह एक अच्छा अभ्यास है? या यह खत्म हो गया है?

उत्तर

15

आपको ग्राफ़िक्स ऑब्जेक्ट को बिल्कुल भी नहीं बदला जाना चाहिए, बल्कि अपने सभी ग्राफिक्स परिचालनों को उस प्रतिलिपि पर निष्पादित करना चाहिए, जिसे आप तब निपटाना चाहते हैं। तब राज्य को रीसेट करने की कोई आवश्यकता नहीं होगी।

public void paintComponent(Graphics g1) { 
    super.paintComponent(g1); 
    final Graphics2D g = (Graphics2D)g1.create(); 
    try { 
     // ...Whole lotta drawing code... 
    } finally { 
     g.dispose(); 
    } 
} 
+3

मैं जावाकॉक के साथ जेकंपोनेंट के लिए इस उत्तर का समर्थन करने जा रहा हूं जो सहमत है: http : //docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#paintComponent%28java.awt.Graphics%29 –

3

हां, यह पालन करने का एक बहुत अच्छा अभ्यास है। आप प्रदर्शन में अधिक भुगतान नहीं करते हैं (वास्तविक पेंटिंग ऑपरेशन के सापेक्ष), और यदि आप ग्राफिक्स संदर्भ में असामान्य परिवर्तन कर रहे हैं तो आप स्वयं को दुःख की गड़बड़ी बचाते हैं। हालांकि इसे अधिक न करें - उदाहरण के लिए, आपको शायद रंग सेटिंग्स के बारे में चिंता करने की आवश्यकता नहीं है।

विकल्प ग्राफिक्स संदर्भ के बारे में कुछ भी नहीं मानना ​​है, और हर पेंटिंग से पहले सभी आवश्यक गुण सेट करना है, अगर वे कुछ गड़बड़ कर रहे हैं। हर ऑपरेशन के लिए ग्राफिक्स ऑब्जेक्ट्स को स्वतंत्र रूप से बनाने और निपटाने से बचने का प्रयास करें।

विशिष्ट गुण आप हमेशा अगर संशोधित बहाल करना चाहिए: (क्योंकि वे बैड थिंग्स करते हैं और अनपेक्षित परिणाम हो सकते हैं):

  • रूपांतरण - क्योंकि इस में किए गए संशोधन के लिए एक दूसरे के ऊपर एक स्टैक और मिल जाएगा बहुत, रीसेट करने के लिए बहुत मुश्किल है। सावधान रहें: इसे ग्राफिक्स 2 डी के अनुवाद, कतरनी, स्केल, घुमाने और बदलने के तरीकों से संशोधित किया गया है। संशोधनों को संशोधित करना सावधानी के साथ प्रयोग किया जाना चाहिए।
  • स्ट्रोक - क्योंकि (कम से कम मेरे कॉन्फ़िगरेशन में), इस डिफ़ॉल्ट को छोड़कर किसी भी सेटिंग से भी अधिक तेज़ हो जाता है, भले ही डिफ़ॉल्ट के बराबर हो। पूछें - यह ग्राफिक्स हार्डवेयर का उपयोग कर डिफ़ॉल्ट केस को तेज करने वाले जावा 2 डी ग्राफिक्स पाइपलाइनों का परिणाम है।
  • क्लिप: परिणामस्वरूप अजीब बग्स होंगे जहां स्क्रीन का केवल एक हिस्सा खींचा जाएगा।
  • समग्र: अधिकांश परिचालन शायद यह अजीब कुछ होने की उम्मीद नहीं करते हैं।

    • RenderingHints:

    गुण के बारे में चिंता नहीं करने के लिए। ये वे चीजें हैं जिन्हें आप आसानी से सेट और पुनर्स्थापित कर सकते हैं, और आम तौर पर आप ऐप चलने के दौरान उन्हें एक निश्चित तरीके (एंटीअलाइजिंग इत्यादि) सेट करना चाहते हैं। रेंडरिंग हिंट्स बदलना शायद ही कभी घटकों के प्रतिपादन को तोड़ देगा, हालांकि यह इसे उलझन में डाल सकता है।

  • पृष्ठभूमि रंग और रंग रंग। वैसे भी ड्राइंग करने से पहले ज्यादातर चीजें इन्हें संशोधित करेंगी।
  • फ़ॉन्ट: इसी प्रकार।
+0

आपको यह पता होना चाहिए कि ग्राफिक्स ऑब्जेक्ट बनाना बेहद सस्ता है। –

+0

एर ... हाँ, सही किया गया।मुझे अभी भी लगता है कि यह एक अच्छा अभ्यास नहीं है, क्योंकि आप कभी भी नहीं जानते कि ग्राफिक्स ऑब्जेक्ट का उपयोग करने के लिए और क्या है, और आप रेंडरिंगहिंट्स आदि के लिए अपनी सेटिंग्स खो देते हैं। – BobMcGee

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