2012-07-25 51 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