5

我正在尝试使用简单的 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);
    }
}

这会将每一帧都很好地绘制到屏幕上。

4

1 回答 1

0

这个http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shape_windows.html包含GradientPaint,这类似于添加ImageImageIcon

于 2011-05-07T17:47:41.513 回答