2012-07-25 87 views
7

我使用paintComponent()JPanel的背景上繪製gif動畫圖像。 它顯示的GIF,但不動畫。 我使用java 1.5,我知道我可以使用帶有圖標的標籤。爲什麼gif動畫在paintComponent()中使用它時沒有動畫?

有沒有人知道爲什麼以及如何解決它?

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

可能的重複[在Swing中顯示動畫BG](http://stackoverflow.com/questions/10836832/show-an-animated-bg-in-swing) – 2012-07-25 12:11:22

回答

9

原因是標準Java ImageIO API只加載gif的第一個圖像。 如何解決? Google用於Java的Gif Loader,它加載了gif的每個圖像。然後你必須在正確的時間畫出正確的圖像。另一種方法是將不同的png文件代表每次動畫的一幀。

更新:呃...其實,在做了一些研究之後,它看起來像你做的那樣,它實際上加載了動畫gif的所有幀。原因是ImageIcon的方法getImage()總是返回第一個圖像。

要解決它,你可以試試這個(我不知道這是否會工作...)

而不是使用Grahpics.drawImage()的,使用ImageIcon.paintIcon()。像這樣:

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

酷和LUL,同時我們發現回答,但我會接受你的答案。 – itro 2012-07-25 12:12:01

+0

你是如何最終解決它的? – 2012-07-25 12:12:45

+0

只是小小的糾正:最後的'這'不需要在那裏。 – itro 2012-07-25 12:17:21

4

圖像觀察者會照顧它。 你應該像下面那樣將觀察者通過g2d.drawImage();

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

在我的情況「這」指的CirclePanel延伸的JPanel,它可以是諸如任何事情,如果你正在使用GIF作爲圖標的按鈕,你應該使用按鈕的圖像觀察者。

+0

這就是我認爲ImageObserver會修復它。你也測試過我的建議嗎?因爲它也使用ImageObserver。 – 2012-07-25 12:22:24