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