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
Bien, supongamos que tenemos la clase
Y lo tenemos en una colección, o un arreglo, con elementos.. así:
Ahora, para crear un JCB con estos elementos, la manera rápida es así: pasando el arreglo como constructor:
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:
Y listo!!!
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
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
El código fuente de este ejemplo se puede obtener de aquí:
http://java.net/projects/apuntes/downloads/download/Swing%252FJComboBoxObjetos.tar.gz
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
Muchas gracias,
ResponderBorrarApunte apuntado!
Hola,
ResponderBorrarMuchas 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.
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
ResponderBorrarMás info:
http://download.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer