Java:具有透明窗口的动画GIF

5

我想在一个透明的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);
    }
}

这可以使每个帧都能很好地显示在屏幕上。

你的修改给了我一个解决问题的想法。谢谢,伙计! - Zar
1个回答

0

我不明白这如何解决我的动画问题。能否详细说明一下? - Shinmera
创建一个窗口(JFrame http://download.oracle.com/javase/tutorial/uiswing/components/toplevel.html),在其中放置一个JLabel http://download.oracle.com/javase/tutorial/uiswing/components/label.html,并使用BorderLayout.Center http://download.oracle.com/javase/tutorial/uiswing/layout/border.html将其居中。然后在JLabel中放置图像或图标http://download.oracle.com/javase/tutorial/uiswing/components/icon.html。 - mKorbel
这就是我的代码已经在做的事情,只是没有透明度。 - Shinmera
好的,那么请将透明度示例与您的代码进行比较,添加缺失的语句和方法 :-) - mKorbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接