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

时间:2012-07-25 11:28:30

标签: java swing jpanel animated-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图像 enter image description here

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

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:4)

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

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

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