2012-09-01 26 views
7

सबसे पहले यह मोज़ेक छवि जनरेटर बनाने के लिए होमवर्क असाइनमेंट का हिस्सा है। मैं प्रोग्राम को रीयलटाइम में पुन: पेश करना चाहता हूं क्योंकि यह एक छवि पाता है और इसे किसी अन्य (स्रोत छवि) पर रखता है।जावा घटक के ओवरलोडेड पेंट को कॉल नहीं कर रहा है कॉम्पोनेंट विधि

यह मेरे मुख्य समारोह में पैनल बनाने के लिए कोड है।

आखिरी टुकड़ा mypanel.create() मोज़ेक तर्क है।

myPanel = new mosiacPanel(sourceFile, sizePercent, pixesize,threads, imageList); 
//test.setText(Integer.toString(myPanel.getWidth())); 
JFrame frame2 = new JFrame("COS 226 MOSIAC OF AWESOMENESS BY SLUIPMOORD && ELEANORASAURUSS"); 
myPanel.setVisible(true); 
myPanel.repaint(); 
frame2.add(myPanel); 
if(myPanel.getWidth() > menubar.getWidth()){ 
    frame2.setSize(myPanel.getWidth() , myPanel.getHeight() + menubar.getHeight()); 
    frame2.repaint(); 
} else { 
    frame2.setSize(menubar.getWidth() , myPanel.getHeight() + menubar.getHeight()); 
} 
frame2.setVisible(true); 
// myPanel.setLocation(170, 4); 
myPanel.create(); 

मोज़ेक पैनल वर्ग कोड स्निपेट

public void create() 
{ 
    ph.createMosiac(imgUrls, this); 
} 

@Override 
protected void paintComponent(Graphics g) 
{ super.paintComponent(g); 
    g.drawImage(imgToPaint, 0, 0, null); 
    // System.out.println("paint"); 
} 

public void paintTile(BufferedImage img) 
{ 

    imgToPaint = img;   
    this.repaint(); 
    // this.paintComponent(this.getGraphics()); 
} 

मैं paintTile समारोह के भीतर मोज़ेक समारोह बनाने कहते हैं।

public void createMosiac(List<String> fileNames, mosiacPanel parent) 
{ 
    ArrayList<TileImage> srcTiles = new ArrayList<TileImage>(); 

    for(int i = 0; i < fileNames.size(); i++) 
    { 
     srcTiles.add(new TileImage(fileNames.get(i), tileSize)); 
    } 

    for(int y = 0; y <= (this.getHeight() - tileSize); y += tileSize) 
    {   
     for(int x = 0; x <= (this.getWidth() - tileSize); x += tileSize) 
     { 
      int location = 0; 
      double dist, high = 2147483647; 
      for(int i = 0; i < srcTiles.size(); i++) 
      { 
       dist = this.getTileImage(x, y).differance(srcTiles.get(i)); 

       if((dist < high)) 
       { 
        high = dist; 
        location = i; 
       }      
      } 

      this.setTileImage(x, y, srcTiles.get(location)); 
      parent.paintTile(this);     
     }    
    }       
} 

यह मेरा प्रोग्राम तर्क है। जब मैं इसे दूसरी स्निपेट // it.paintComponent (this.getGraphics()) में अनमोल करता हूं; कार्यक्रम काम करता है लेकिन यह एक भयानक फ़्लैश के साथ पश्चाताप करता है और मैं मेडिकल बिलों में से एक नहीं हूं जब डेमो स्थल के भीतर मेरे कुछ अन्य छात्र मिर्गी हमलों से ग्रस्त हैं।

यदि मैं पेंट कॉम्पोनेंट फ़ंक्शन का पता लगाता हूं तो इसे प्रोग्राम के अंत में दो बार बुलाया जाता है, न कि प्रत्येक पश्चाताप पर।

अग्रिम धन्यवाद।

मैंने एक सोर्स कोड जोड़ा जो आप सिर्फ प्रतिलिपि बना सकते हैं और चला सकते हैं। एक छवि आप डिफ़ॉल्ट के साथ परीक्षण करना चाहते हैं का चयन करें वर्तमान में उपलब्ध क्योंकि तुम लोगों की जरूरत नहीं है नहीं है, यह

और फिर एक निर्देशिका साथ यह पल मैं अभी भी पर बहुत धीमी है यह टाइल करने के लिए जेपीजी का एक समूह से युक्त Google docs link to the java file

+5

जल्द से जल्द बेहतर सहायता के लिए, कृपया एक [एसएससीई] (http://sscce.org) – mre

+6

शामिल करें आपको सीधे 'paintComponent (...)' नहीं बुलाया जाना चाहिए और न ही आप 'getGraphics() ' ग्राफिक्स ऑब्जेक्ट प्राप्त करने के लिए एक घटक पर। इसके बजाय जेवीएम से ग्राफिक्स ऑब्जेक्ट का उपयोग करें (जब तक कि आप BufferedImage के ग्राफिक्स ऑब्जेक्ट के साथ काम नहीं कर रहे हों)। स्विंग ग्राफिक्स ट्यूटोरियल यह सब बताते हैं। –

+0

आश्चर्य है कि यह 'parent.paintTile (यह) 'संकलित कैसे करें? –

उत्तर

1

किसी अन्य थ्रेड में पुनर्भुगतान करने की आवश्यकता है। शायद यह आपकी समस्या का समाधान होगा। शुभकामनाएँ! :)

+0

क्या आप इसे आजमाते हैं ??? क्या यह काम करता है??? :) – Hydroid

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