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

#java #animation #transparency #animated-gif #awtutilities

#java #Анимация #прозрачность #анимированный-gif #awtutilities

Вопрос:

Я пытаюсь отобразить анимированный 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. Ваша правка дала мне идею о том, как решить проблему. Спасибо, приятель!

Ответ №1:

Комментарии:

1. Я не вижу, как это решает мою проблему с анимацией. Хотите уточнить?

2. создайте окно (JFrame download.oracle.com/javase/tutorial/uiswing/components /… ), поместите здесь JLabel download.oracle.com/javase/tutorial/uiswing/components /… с BorderLayout. Центр download.oracle.com/javase/tutorial/uiswing/layout/border.html и в качестве JLabel поместите изображение или ImageIcon download.oracle.com/javase/tutorial/uiswing/components /…

3. Это то, что мой код уже делает, без прозрачности.

4. хорошо, тогда сравните пример из translucency с вашим кодом, добавьте пропущенные инструкции и методы 🙂