2012-08-15 15 views
7

यहां अंडाकार ड्राइंग का सरल उदाहरण है।स्विंग क्यों सरल घटक दो बार आकर्षित करता है?

public class SwingPainter extends JFrame{ 
    public SwingPainter() { 
     super("Swing Painter"); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     getContentPane().add(new MySwingComponent()); 

     setSize(200, 200); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new SwingPainter(); 
    } 

    class MySwingComponent extends JComponent { 

     public void paintComponent(Graphics g) { 
      System.out.println("paintComponent"); 
      super.paintComponent(g); 
      g.setColor(Color.red); 
      g.fillOval(10, 10, 50, 50); 
     } 

     @Override 
     protected void paintBorder(Graphics g) { 
      System.out.println("Paint border"); 
      super.paintBorder(g); 
     } 

     @Override 
     protected void paintChildren(Graphics g) { 
      System.out.println("Paint children"); 
      super.paintChildren(g); 
     } 
    } 
} 

लेकिन डिबग मोड या कुछ जानकारी (उदाहरण के रूप में) निकालने से पहले सांत्वना देने जोड़ने में, आप देख सकते हैं कि स्विंग दो बार घटकों खींचता है।

paintComponent

पेंट सीमा

पेंट बच्चों

paintComponent

पेंट सीमा

पेंट बच्चों

मुझे समझ में नहीं आता कि ऐसा क्यों होता है, लेकिन मुझे लगता है कि यह एक कठिन जीयूआई में प्रदर्शन को प्रभावित कर सकता है।

+0

http://stackoverflow.com/questions/4814289/why-is-my-code-executing-paintcomponentgraphics-page-twice –

+0

संभव डुप्लिकेट [पेंटकंपोनेंट दो बार निष्पादित हो रहा है] के संभावित डुप्लिकेट (http: // stackoverflow। कॉम/प्रश्न/4800885/पेंटकंपोनेंट-ए-एक्जिकिंग-दो बार) –

उत्तर

9

लेख Painting in AWT and Swing: Additional Paint Properties: Opacity लेख बताता है कि क्यों: "अपारदर्शी संपत्ति स्विंग की पेंट सिस्टम को यह पता लगाने की अनुमति देती है कि किसी विशेष घटक पर एक पुन: अनुरोध के लिए अंतर्निहित पूर्वजों की अतिरिक्त पुनर्भुगतान की आवश्यकता होगी या नहीं।" क्योंकि आप JComponent का विस्तार करते हैं, opaque संपत्ति डिफ़ॉल्ट रूप से गलत है, और अनुकूलन संभव नहीं है। अंतर देखने के लिए संपत्ति true सेट करें, साथ ही साथ संपत्ति का सम्मान न करने से आर्टिफैक्ट सेट करें। संबंधित उदाहरण here और here पाए जा सकते हैं।

+0

हां, आप सही हैं। यह अपारदर्शी के कारण है। जब मैं इसे सत्य पर सेट करता हूं, केवल 3 रिकॉर्ड कंसोल आउटपुट में होते हैं। मुझे अपारदर्शी काम की अधिक अच्छी तरह से जांच करने की आवश्यकता है :) – Dragon

2

मैं कॉन्स्टेंटिन से सहमत हूं, आपको याद रखने की आवश्यकता है, जब एप्लिकेशन प्रारंभ होता है तो पुनर्विक्रेता प्रबंधक किसी भी अनुरोध के जवाब दे रहा है, इसमें आम तौर पर प्रारंभिक पेंट अनुरोध शामिल होता है जब खिड़की दिखायी जाती है और आकार बदलती है (दो है)।

इसे आजमाएं। एप्लिकेशन चल रहा है और खिड़की का आकार बदलने तक प्रतीक्षा करें। मुझे यकीन है कि आपको दो बार फिर से दोबारा अनुरोध मिलेगा;)

2

यह मेरे लिए ठीक काम करता है। वास्तव में, यहां तक ​​कि डिबग मोड में उत्पादन किया गया था:

paintComponent 
Paint border 
Paint children 

कृपया ध्यान रखें कि AWT और स्विंग घटकों में वहाँ कई तरीके (पेंट, paintBorder, paintChildren, paintComponent, फिर से रंगना, और अन्य) कर रहे हैं में भालू है कि कहा जाता है कॉल-बैक के माध्यम से, जब भी जीयूआई इंजन उपयुक्त पाता है। यह JVM से JVM तक या विभिन्न निष्पादन सत्रों से भी भिन्न हो सकता है। उन्हें आपके कार्यक्रम में बातचीत से भी ट्रिगर किया जा सकता है (उदाहरण के लिए, यदि आप न्यूनतम/अधिकतम करते हैं)। या वे बिल्कुल नहीं कर सकते हैं।

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