Использование анимированного GIF в JComboBox
Я пытаюсь использовать анимированные (GIF) иконки в JComboBox.
Поскольку DefaultListCellRenderer основан на JLabel, ImageIcons напрямую поддерживаются при помещении их в ComboBoxModel.
Однако это не работает с анимированными GIF-файлами.
В раскрывающемся списке они не отображаются вообще, если они не выбраны (хотя GIF-файлы работают при использовании в обычном JLabel)
Код для заполнения комбинированного списка прост:
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 является статическим и отображается без проблем. Остальные анимированы. (Изображениянаходятся загружен правильно, потому что если я назначу какой-либо из этих значков непосредственно JLabel, они будут отображаться просто отлично)
Я также попытался использовать свой собственный ListCellRenderer, основанный на JPanel (вдохновленный ответом на этот вопрос:Java анимированный GIF без использования JLabel).
Это работаетнемного лучше, но не идеально. Значки отображаются только в том случае, если я наведу на них указатель мыши, пока отображается раскрывающийся список. Так что я думаю, что это проблема ремонта, хотя я не знаю, где
Это часть из моего JPanel, которая реализует интерфейс ListCellRenderer.
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;
}
Призыв revalidate () и repaint () был вдохновлен просмотром кода JLabel.setIcon ()
Метод paint () также прост:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (image != null)
{
g.drawImage(image, 0, 0, this);
}
}
Есть идеи? Мне не нужны анимированные иконки в выпадающем меню (хотя это было бы неплохо), но я бы по крайней мере хотел бы видеть статичные изображения.