我正在使用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);
答案 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作为按钮的图标,它可以是任何东西,你应该使用按钮作为图像观察者。