Mastodon

JComboBox de Objetos

Cuando se usa Swing, el problema más común es mostrar elementos en un JComboBox. Lo que "normalmente" hacen es agregar cadenas a los elementos del JCB (JComboBox), pero para obtener el elemento seleccionado, se obtendría solo el valor puestos. Algunos hasta colocan el ID del elemento a mostrar, y luego buscan el elemento seleccionado en la colección. Toda una jarana... pero ¿han notado que para obtener el elemento seleccionado se utiliza el método getSelectedItem() que devuelve un objeto? Si debería mostrar String, entonces, debería devolver un String, ¿cierto? En este post explicaremos como utilizar correctamente el JCB.

Bien, supongamos que tenemos la clase Persona como el que sigue:

//...
public class Persona {

    private int idPersona;
    private String nombre;
    private int edad;

    public Persona() {
    }

    public Persona(int idPersona, String nombre, int edad) {
        this.idPersona = idPersona;
        this.nombre = nombre;
        this.edad = edad;
    }
//.. sus get y sets
//...

Y lo tenemos en una colección, o un arreglo, con elementos.. así:
//...
        Persona[] personas=new Persona[]{
            new Persona(10, "Albert", 20),
            new Persona(15, "Bernard", 21),
            new Persona(20, "Carl", 22),
        };
//...

Ahora, para crear un JCB con estos elementos, la manera rápida es así: pasando el arreglo como constructor:
//...
personasCB = new JComboBox(personas);
//...

Pueden usar cualquier forma, como addItem(), pero lo que quiero dejar en claro, es que no se agregan String, sino los mismos objetos.

Ahora, para obtener el objeto seleccionado, bastará con hacer esto:

//...
Persona p = (Persona) personasCB.getSelectedItem();
//...

Y listo!!!

Un momento, pero los elementos del combo me parecen cosas raras!! quiero que me devuelvan mi dinero!

Aún no terminé de explicar. El JCB convierte cada elemento del arreglo a String, si ponemos un arreglo de Long, lo vuelve a arreglo de String, un Double lo vuelve String.. y un objeto Persona también lo vuelve a String.

¿Sabes dónde se tiene que indicar como debe ser convertido a String un Objeto?

Respuesta: redefine el método toString() que es heredado de la clase Object... es decir, sobreescribimos el método toString() de la clase Persona.


//...
public class Persona {

    private int idPersona;
    private String nombre;
    private int edad;
//...
    @Override
    public String toString() {
        return nombre;
    }
    
    
}
//...

Si quieres que aparezca con ID, cambia lo que devuelve el método toString.. si quiers un formato especial.. igual.. todo es en el método toString()

El código fuente de este ejemplo se puede obtener de aquí:
http://java.net/projects/apuntes/downloads/download/Swing%252FJComboBoxObjetos.tar.gz
Artículo Anterior Artículo Siguiente