Я пытаюсь использовать анимированные иконки (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 (вдохновленный ответом на этот вопрос: GIF-анимация на Java без использования 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);
}
}
Есть идеи? Мне не нужно, чтобы эти иконки анимировались в выпадающем меню (хотя это было бы неплохо), но я бы по крайней мере хотел бы видеть статичные изображения.