我正在尝试使用简单的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)); 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)); g2.clearRect(0,getIconWidth(),getIconHeight()); super.paintIcon(c,g2,x,y); } }
这样可以很好地将每一帧画在屏幕上.