为什么在paintComponent()中使用GIF动画不会播放?

7

我正在使用paintComponent()方法将一个gif动画图像绘制在JPanel的背景上。 它显示出来了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图片。
enter image description here

编辑:只需在g2d.drawImage()方法中添加image observer即可。

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

可能是在Swing中显示动画背景的重复问题 - Andrew Thompson
2个回答

9
原因是标准的Java ImageIO API只加载gif的第一帧图像。如何解决?在谷歌中搜索Java的Gif加载器,它可以加载gif的每一帧。然后您需要在正确的时间画出正确的图像。另一种方法是使用不同的png文件来表示动画中的每一帧。
更新:嗯...实际上,在做了一些研究之后,看起来你的方式实际上加载了动画gif的所有帧。原因是ImageIcon的方法getImage()总是返回第一张图片。
要修复它,您可以尝试这样做(我不确定是否有效...)
不要使用Graphics.drawImage(),使用ImageIcon.paintIcon()。像这样:
imageIcon.paintIcon(this, g2d, getWidth() / 2 - imageIcon.getIconWidth() / 2, getHeight() / 2);

酷和LUL,我们同时找到了答案,但我会接受你的答案。 - itro
只需要进行小的更正:最后一个“this”不需要存在。 - itro
1
Mr. Martijn Courteaux,我已经在下面添加了我的答案,并且我将更新原始代码。 - itro

4

图片观察者会处理它。你只需要像下面这样将观察者传递给 g2d.drawImage();

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

在我的情况下,“this”指的是扩展JPanel的CirclePanel,它可以是任何东西。例如,如果您正在使用gif作为按钮的图标,则应将按钮用作图像观察器。

那就是我想的,ImageObserver应该可以解决这个问题。你也测试了我的建议吗?因为那个也使用了ImageObserver。 - Martijn Courteaux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接