Usando um GIF animado em um JComboBox

Estou tentando usar ícones animados (GIF) em um JComboBo

Como o DefaultListCellRenderer é baseado no JLabel, os ImageIcons são suportados diretamente ao colocá-los no ComboBoxMode

No entanto, isso não funciona com GIFs animado

No menu suspenso, eles não são exibidos, a menos que sejam selecionados (os GIFs funcionam quando usados em um JLabel normal)

O código para preencher a caixa de combinação é direto:

ImageIcon[] data = new ImageIcon[4];
data[0] = new ImageIcon("icon_one.gif");
data[1] = new ImageIcon("icon_two.gif");
data[2] = new ImageIcon("icon_three.gif");
data[3] = new ImageIcon("icon_four.gif");
ComboBoxModel model = new DefaultComboBoxModel(data);
setModel(model);

icon_one.gif é o estático e é mostrado sem problemas. Os outros são animados. (As imagensestamo carregado corretamente porque se eu atribuir algum desses ícones a um JLabel diretamente, eles serão exibidos muito be

Também tentei usar meu próprio ListCellRenderer com base em um JPanel (inspirado na resposta a esta pergunta: GIF animado Java sem usar um JLabel).

Isso funciona ummorde melhor, mas também não é o ideal. Os ícones são mostrados apenas se eu mover o mouse sobre eles enquanto o menu suspenso é mostrado. Acho que é um problema de repetição, embora eu não saiba onde

sta é a parte do meu JPanel que implementa a interface ListCellRendere

public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
  this.image = ((ImageIcon)value).getImage();
  if (isSelected)
  {
    setBackground(list.getSelectionBackground());
    setForeground(list.getSelectionForeground());
  }
  else
  {
    setBackground(list.getBackground());
    setForeground(list.getForeground());
  }
  revalidate();
  repaint();

  return this;
}

A chamada para revalidate () e repaint () foi inspirada ao observar o código de JLabel.setIcon ()

O método paint () também é direto:

public void paintComponent(Graphics g)
{
  super.paintComponent(g);
  if (image != null)
  {
    g.drawImage(image, 0, 0, this);
  }
}

Alguma ideia? Eu realmente não preciso que esses ícones sejam animados na lista suspensa (embora isso seja legal), mas eu gostaria de pelo menos ver as imagens estática

questionAnswers(2)

yourAnswerToTheQuestion