Я пытаюсь отобразить анимированный GIF на прозрачном JDialog, используя простой JLabel:
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 не очищается каждый шаг перекраски.
Кто-нибудь знает, как я могу это исправить?
Edit:
Я нашел решение.
Мне пришлось переопределить функцию PaintIcon в ImageIcon и вручную очистить холст:
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);
}
}
это хорошо рисует каждый кадр на экране.