为什么gif动画在paintComponent()中使用它时没有动画?

我正在使用paintComponent()JPanel的背景上绘制一个gif动画图像。 它显示了gif但没有动画。 我使用java 1.5,我知道我可以使用带有图标的标签。

有没有人知道为什么以及如何解决它?

  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图像。
在此处输入图像描述

编辑:只需将图像观察者添加到g2d.drawImage()方法。

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

原因是标准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); 

图像观察者会照顾它。 你应该将观察者放到g2d.drawImage(); 如下。

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

在我的情况下,’this’指的是扩展JPanel的CirclePanel,例如,如果你使用gif作为按钮的图标,它可以是任何东西,你应该使用按钮作为图像观察者。