jueves, 3 de febrero de 2011

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


3 comentarios:

  1. Hola,
    Muchas grácias por tu aporte. Yo tengo hecho lo mismo pero recuperando los datos de una BBDD. El problema que tengo es que no he encontrado la manera de que el combo muestre por defecto el valor que ya se habia seleccionado anteriormente.
    Por ejemplo, imaginate que del bean "Personas" quiero que salga seleccionado "Carl" porque en mi BBDD tengo una tabla de responsables y en ella guardo el código "15" que es el de esa persona.
    Lo he intentado con el setSelectedItem pero no me hace nada :)

    Grácias y saludos.

    ResponderEliminar
  2. Otra alternativa mejor en mi opinión es el uso de los CellRender, en el caso de un ComboBox un ListCellRender, así no tienes que sobreescribir el método toString

    Más info:
    http://download.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer

    ResponderEliminar

Si quieres hacer una pregunta más específica, hazla en los foros que tenemos habilitados en Google Groups


Ah! solo se permiten comentarios de usuarios registrados. Si tienes OpenID, bienvenido! Puedes obtener su OpenID, aquí: http://openid.net/