Poner iconos en un JCombobox

De ChuWiki

Vamos a ver en este ejemplo cómo poner iconos o imagenes en un JCombobox.

Añadir items al JComboBox[editar]

Primero construimos nuestro JComboBox con los items que queramos que tenga, pueden ser String o cualquier otra cosa que se nos ocurra. Incluso los mismos iconos. Lo normal sería que fuera el dato que queremos recoger cuando se seleccione una de las opciones.

JComboBox combo = new JComboBox();
combo.addItem("uno");
combo.addItem("dos");
combo.addItem("tres");
combo.addItem("cuatro");

Cambiar el Render del JComboBox[editar]

El siguiente paso es decir al JComboBox cómo queremos que dibuje esos items. Para ellos, debemos llamar a su método setRenderer(ListCellRenderer) y pasarle una clase que implemente ListCellRenderer. Esta clase tiene un método getListCellRendererComponent() que debemos implementar.

A este método le pasarán, entre otras cosas, el dato del JComboBox que debemos pintar, es decir, el "uno", "dos", "tres" o "cuatro" que pusimos en el ejemplo anterior. En función de ese dato, debemos crear y devolver el Component java que servirá para dibujar ese dato. Como queremos un icono, nos bastará con devolver un JLabel con el icono dentro.

Vamos a ello, hacemos una clase que implemente ListCellRenderer y que para cada uno de los posibles items devuelva un JLabel con un icono distinto

package com.chuidiang.ejemplos.iconos_jcombobox;

import java.awt.Component;
import java.util.Hashtable;

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

/**
 * Ejemplo de Render para un JComboBox, que devuelve un icono para cada uno de
 * los posibles items.
 * 
 * @author chuidiang
 *
 */
public class RenderJCombobox extends JLabel implements ListCellRenderer {
    /** Para guardar los iconos por cada item. El item es la clave y el valor
     * es el icono.
     */
    Hashtable<Object, ImageIcon> icono = null;

    /**
     * Construye el Hashtable con los iconos seleccionados, asociándolos a los
     * items que tendrá el JComboBox "uno", "dos", "tres" y "cuatro"
     */
    public RenderJCombobox() {
        icono = new Hashtable<Object, ImageIcon>();
        icono.put("uno", new ImageIcon("kopete010.gif"));
        icono.put("dos", new ImageIcon("kopete011.gif"));
        icono.put("tres", new ImageIcon("kopete012.gif"));
        icono.put("cuatro", new ImageIcon("kopete013.gif"));
    }

    /**
     * En función del value que se pasa (el item del JComboBox), se pone el icono
     * y se devuelve el JLabel.
     */
    @Override
    public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        if (icono.get(value) != null)
            setIcon(icono.get(value));
        else
            setIcon(null);
        return this;
    }

}

Simplemente un detalle. Al igual que todos los Render de todos los componentes Swing, el JComboBox usa el JLabel que se le devuelve para "hacerle una foto" y poner la foto en pantalla. Por ello, podemos usar siempre el mismo JLabel y por ello, es más eficiente que nuestro Render herede de JLabel, se autoponga el icono y se devuelva a sí mismo que hacer un new JLabel() cada vez. También ten en cuenta que cómo se "hace una foto", no puedes poner gifs animados. Si lo pones, sólo se verá la imagen que toque en el momento de "hacer la foto".

Una vez hecho esto, sólo nos queda poner este Render en el JComboBox y seleccionar el item que queramos que se muestre en primer lugar.

 combo.setRenderer(new RenderJCombobox());
 combo.setSelectedIndex(0);

Ejemplo completo de JCombobox con imagenes[editar]

A continuación el código completo del main() de ejemplo. Por supuesto, si quieres ejecutarlo y que funcione, tendrás que buscarte unos iconos y poner el nombre de los ficheros en el código del Render.

package com.chuidiang.ejemplos.iconos_jcombobox;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

/**
 * Ejemplo de JComboBox al que se cambia el Render para muestre iconos.
 * @author chuidiang
 *
 */
public class IconosJcomobobox {

    /**
     * Construye la ventana, el JComboBox, el Render y lo pinta tod.
     * @param args
     */
    public static void main(String[] args) {
        // Ventana principal
        JFrame v = new JFrame("Ejemplo iconos en JCombobox");
        
        // JComboBox con los items.
        JComboBox combo = new JComboBox();
        combo.addItem("uno");
        combo.addItem("dos");
        combo.addItem("tres");
        combo.addItem("cuatro");
        
        // Se le pasa el Render con los iconos.
        combo.setRenderer(new RenderJCombobox());
        combo.setSelectedIndex(0);

        // Se visualiza todo.
        v.getContentPane().add(combo);
        v.pack();
        v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        v.setVisible(true);
    }

}

y este es el resultado de ejecutar el programa

Ejemplo de iconos o imagenes en un JCombobox