我想在一个透明的JDialog上使用简单的JLabel显示一个动态gif图像:
JDialog dialog = new JDialog();
AWTUtilities.setWindowOpaque(dialog,false);
JLabel label = new JLabel();
ImageIcon ii = new ImageIcon("animation.gif");
label.setIcon(ii);
JPanel panel = new JPanel();
panel.setBackground(new Color(0,0,0,0));
panel.add(label);
dialog.add(panel);
dialog.setVisible(true);
这几乎可以实现。它能平滑地显示动画,并且具有透明度。
问题在于,所有动画帧都叠加在一起,而不是在每个帧步骤中得到清除的画布和当前帧。
我猜测JLabel的画布在每次重绘时没有被清除。
有人知道我该如何解决吗?
编辑:
我想出了一个解决方案。
我必须重写ImageIcon的paintIcon函数并手动清除画布:
class ClearImageIcon extends ImageIcon{
public ClearImageIcon(String filename){super(filename);}
@Override
public synchronized void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2 = (Graphics2D)g.create();
g2.setBackground(new Color(0,0,0,0));
g2.clearRect(0, 0, getIconWidth(), getIconHeight());
super.paintIcon(c, g2, x, y);
}
}
这可以使每个帧都能很好地显示在屏幕上。