2012-07-25 50 views
7

मैं JPanel की backgound पर एक gif एनिमेटेड छवि पेंट करने के लिए paintComponent() उपयोग कर रहा हूँ। यह gif दिखाता है लेकिन एनिमेट नहीं करता है। मैं जावा 1.5 का उपयोग करता हूं और मुझे पता है कि मैं आइकन के साथ लेबल का उपयोग कर सकता हूं।पेंट कॉम्पोनेंट() में इसका उपयोग करते समय gif एनीमेशन एनिमेट क्यों नहीं करता है?

शरीर के किसी भी पता है क्यों और कैसे इसे ठीक करने के?

private static class CirclePanel extends JPanel { 

    ImageIcon imageIcon = new ImageIcon(BarcodeModel.class.getResource("verify.gif")); 
    Point point = f.getLocation(); 
    protected void paintComponent(Graphics g) { 
     Graphics gc = g.create(); 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f)); 
     g2d.setColor(Color.BLUE); 
     g2d.drawImage(imageIcon.getImage(), getWidth()/2, getHeight()/2, null); 
     g2d.drawRect(0, 0, getWidth(), getHeight()); 
     g2d.setStroke(new BasicStroke(10f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER)); 
     g2d.setFont(g.getFont().deriveFont(Font.BOLD | Font.ITALIC,15f)); 
     g2d.drawString("Wait Please ...",getWidth()/2-imageIcon.getIconHeight()/3,getHeight()/2+imageIcon.getIconHeight()+15); 

     g2d.dispose(); 

} 

यह gif छवि है।
enter image description here

संपादित: सिर्फ विधि g2d.drawImage() करने के लिए छवि प्रेक्षक जोड़ें।

g2d.drawImage(imageIcon.getImage(), getWidth()/2, getHeight()/2, this); 
+0

संभव डुप्लिकेट [स्विंग में एनिमेटेड बीजी दिखाएं] (http://stackoverflow.com/questions/10836832/show-an-animated-bg-in-swing) –

उत्तर

9

कारण यह है कि मानक जावा ImageIO केवल API gif की पहली छवि को लोड करता है। कैसे ठीक करें? जावा के लिए एक गिफ़ लोडर के लिए Google, जो gif की प्रत्येक छवि लोड करता है। फिर आपको सही समय पर सही छवि पेंट करनी होगी। एक वैकल्पिक तरीका होगा विभिन्न पीएनजी फाइलें प्रत्येक बार एनीमेशन के एक फ्रेम का प्रतिनिधित्व करते हैं।

अद्यतन: खैर ... वास्तव में, कुछ अनुसंधान करने के बाद, जिस तरह से आप यह वास्तव में किया था ऐनिमेटेड gif के सभी तख्ते लोड करता है की तरह लग रहा है। इसका कारण यह है कि ImageIcon की विधि getImage() हमेशा पहली छवि लौटाती है।

इसे ठीक करने के लिए, आप इसके बजाय Grahpics.drawImage() का उपयोग करने का यह कोशिश कर सकते हैं (मुझे यकीन है कि अगर यह काम करेगा नहीं कर रहा हूँ ...)

, ImageIcon.paintIcon() का उपयोग करें। इस तरह:

imageIcon.paintIcon(this, g2d, getWidth()/2 - imageIcon.getIconWidth()/2, getHeight()/2); 
+0

कूल और एलयूएल, उसी समय हम पाते हैं जवाब लेकिन मैं आपका जवाब स्वीकार करूंगा। – itro

+0

आपने अंत में इसे कैसे हल किया? –

+0

बस छोटा सा सुधार: पिछले 'इस' वहाँ होने की जरूरत नहीं है। – itro

4

छवि पर्यवेक्षक इसका ख्याल रखेंगे। आपको पर्यवेक्षक को नीचे दिए गए g2d.drawImage(); पर पैस करना चाहिए।

g2d.drawImage(imageIcon.getImage(), getWidth()/2, getHeight()/2, this); 
मेरे मामले छवि प्रेक्षक के रूप में 'इस' बटन यदि आप एक बटन के लिए एक प्रतीक के रूप में प्रयोग कर रहे हैं gif CirclePanel जो JPanel फैली का उल्लेख है, यह उदाहरण के लिए किसी भी बात हो सकती है, आप का उपयोग करना चाहिए में

+0

अद्यतन करेगा। आप मेरे सुझाव के रूप में अच्छी तरह से परीक्षण किया? क्योंकि यह ImageObserver का भी उपयोग करता है। –