【问题标题】:Why gif animation doesn't animate when using it in paintComponent()?为什么在paintComponent()中使用gif动画时没有动画?
【发布时间】:2012-07-23 19:45:57
【问题描述】:

我正在使用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 swing jpanel animated-gif paintcomponent


【解决方案1】:

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

【讨论】:

  • 酷和LUL,同时我们找到了答案,但我会接受你的答案。
  • 只是小修正:最后一个“this”不需要在那里。
  • Martijn Courteaux 先生,我确实在下面添加了我的答案,我也会更新原始代码
【解决方案2】:

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

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

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

【讨论】:

  • 这就是我的想法,ImageObserver 会修复它。你也测试了我的建议吗?因为它也使用了 ImageObserver。
猜你喜欢
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多