为什么GIF动画不使用的paintComponent当(动画)?(Why gif animation

2019-06-26 13:14发布

我使用paintComponent()画在的backgound动画图像的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);

Answer 1:

其原因是,标准的Java API的ImageIO只加载GIF的第一个图像。 怎么修? 谷歌对于GIF装载机为Java,它加载GIF的每一个形象。 然后,你必须在正确的时间来画右侧图像。 一种替代的方法是将具有表示动画的每个时间一帧不同的PNG文件。

更新:嗯......其实,做一些研究之后,它看起来像你这样做,它实际上加载gif动画的所有帧的方式。 其理由是,的ImageIcon的方法getImage()总是返回第一个图像。

为了解决这个问题,你可以试试这个(我不知道这是否会工作...)

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

imageIcon.paintIcon(this, g2d, getWidth() / 2 - imageIcon.getIconWidth() / 2, getHeight() / 2);


Answer 2:

图像的观察者会照顾它。 你应该只PAS观测到g2d.drawImage(); 如下。

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

在我的情况“这”指的CirclePanel延伸的JPanel,它可以是诸如任何事情,如果你正在使用GIF作为图标的按钮,你应该使用按钮的图像观察者。



文章来源: Why gif animation doesn't animate when using it in paintComponent()?