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

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

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

2 回答 2

9

原因是标准的 Java ImageIO API 只加载 gif 的第一张图像。怎么修?谷歌为 Java 提供了一个 Gif Loader,它可以加载 gif 的每个图像。然后你必须在正确的时间绘制正确的图像。另一种方法是使用不同的 png 文件代表动画的每次一帧。

更新:嗯......实际上,在做了一些研究之后,看起来你的方式实际上加载了动画 gif 的所有帧。原因是 ImageIcon 的方法getImage()总是返回第一张图像。

要修复它,你可以试试这个(我不确定它是否会工作......)

而不是使用Grahpics.drawImage(),使用ImageIcon.paintIcon()。像这样:

imageIcon.paintIcon(this, g2d, getWidth() / 2 - imageIcon.getIconWidth() / 2, getHeight() / 2);
于 2012-07-25T11:34:02.777 回答
4

图像观察者会处理它。您应该将观察者传递给g2d.drawImage();如下。

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

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

于 2012-07-25T12:10:03.257 回答