Imagem em um JComboBox
 20 Setembro 2017
 Java | Swing
 Rodrigo Costa Corrêa

Todo mundo já quis colocar uma imagem uma Combo Box, seja para mostrar bandeiras de países, avatares ou até simples ícones. Vou mostrar para vocês como fazer isso no Java Swing usando o JComboBox.

Precisamos criar duas classes:

import javax.swing.ImageIcon;
import javax.swing.JComboBox;

@SuppressWarnings("rawtypes")
public class LanguagesComboBox extends JComboBox {

	private static final long serialVersionUID = 1L;

	private ImageIcon img;

	private String[][] LIST_LANGUAGES = new String[][] { { "pt", "pt.jpg" }, { "en", "en.jpg" } };

	@SuppressWarnings("unchecked")
	public LanguagesComboBox() {
		for (String[] item : LIST_LANGUAGES) {
			img = new ImageIcon(getClass().getResource("/images/flags_language/" + item[1]));
			img.setDescription(item[0]);
			this.addItem(img);
		}
		LanguageComboBoxRenderer renderer = new LanguageComboBoxRenderer();
		setRenderer(renderer);
		setEditable(false);
	}

	public void setSelectedLanguage(String value) {
		for (int i = 0; i < LIST_LANGUAGES.length; i++) {
			if (value.equals(LIST_LANGUAGES[i][0])) {
				img = new ImageIcon(getClass().getResource("/images/flags_language/" + LIST_LANGUAGES[i][1]));
				img.setDescription(LIST_LANGUAGES[i][0]);
				setSelectedIndex(i);
			}
		}
	}
}
import java.awt.Component;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;

@SuppressWarnings("rawtypes")
class LanguageComboBoxRenderer extends JLabel implements ListCellRenderer {
   private static final long serialVersionUID = 1L;
	public LanguageComboBoxRenderer() {
        setOpaque(true);
        setHorizontalAlignment(LEADING);
        setVerticalAlignment(CENTER);
    }
    public Component getListCellRendererComponent(
        JList list,
        Object value,
        int index,
        boolean isSelected,
        boolean cellHasFocus)
    {
        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        } else {
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }
        ImageIcon icon = (ImageIcon)value;
        Image img = icon.getImage().getScaledInstance(30, 22, Image.SCALE_DEFAULT);
        setText(icon.getDescription());
        setIcon(new ImageIcon(img));
        return this;
    }
}

Exemplo de uso:

LanguagesComboBox cbLanguages = new LanguagesComboBox();
YOUR_PAINEL.add(cbLanguages);

As imagens usadas nesse exemplo precisam estar no seguinte caminho: src/images/flags_language/

Clique Aqui para baixar as imagens usada no exemplo.