Java: анимированный GIF с прозрачным окном

Я пытаюсь отобразить анимированный 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 не очищается каждый шаг перекраски. Кто-нибудь знает, как я могу это исправить?

Изменить: я нашел решение. Мне пришлось переопределить функцию 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);
    }
}

это хорошо рисует каждый кадр на экране.

1 ответ

Этот http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html содержит GradientPaint, что аналогично тому, как добавить Image или ImageIcon

Другие вопросы по тегам