为什么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图像。
编辑:只需将图像观察者添加到g2d.drawImage()方法。
g2d.drawImage(imageIcon.getImage(), getWidth() / 2, getHeight() / 2, this);
原因是标准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);
图像观察者会照顾它。 你应该将观察者放到g2d.drawImage();
如下。
g2d.drawImage(imageIcon.getImage(), getWidth() / 2, getHeight() / 2, this);
在我的情况下,’this’指的是扩展JPanel的CirclePanel,例如,如果你使用gif作为按钮的图标,它可以是任何东西,你应该使用按钮作为图像观察者。