Java:带透明窗口的动画GIF

时间:2011-05-07 17:15:37

标签: java animation transparency animated-gif awtutilities

我正在尝试使用简单的JLabel在透明的JDialog上显示动画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);
    }
}

这会很好地将每一帧画在屏幕上。