Foros del Web » Programación para mayores de 30 ;) » Java »

rellenar combo box

Estas en el tema de rellenar combo box en el foro de Java en Foros del Web. Hola amig@s. Resulta que ahora me ha tocado programar en java y tengo un pequeño problema. La tabla con la que quiero rellenar el combo ...
  #1 (permalink)  
Antiguo 05/03/2008, 19:05
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 17 años
Puntos: 2
rellenar combo box

Hola amig@s.
Resulta que ahora me ha tocado programar en java y tengo un pequeño problema.
La tabla con la que quiero rellenar el combo tiene un id como clave primaria, numérico, pero lo que quiero mostrar en el combo box es el nombre.
Claro, la tabla en la que se insertan los datos, una vez rellenados todos, incluso el combo, no contiene dicho nombre, sino la referencia al id.
La cuestión está en que me gustaría que el combo mostrase unos datos pero tomase como valor el id correspondiente y no encuentro la manera de hacerlo.
Podríais guiarme??

Muchas gracias!!
  #2 (permalink)  
Antiguo 06/03/2008, 04:32
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Sonrisa Re: rellenar combo box

El tutorial de java...
http://java.sun.com/docs/books/tutor.../combobox.html

-----------------------

Un ejemplo.. directamente de un ResultSet... :

1. Una Clase "ResultSetComboBoxModelObject", se va a instanciar 1 por cada registro regresado de la base de datos.
2. La Clase "ResultSetComboBoxModel" implementa "ComboBoxModel", el constructor recibe un Recordset y el nombre de dos campos en la base de datos que debe ser el primero numérico y el segundo de texto. Permite buscar por el código o la descripcion. Y permite obtener el código o la descripción del "item" seleccionado. Muestra solo la descripción.

Un objeto donde se guardan los registros de la base de datos.

Código:
/*
 * ResultSetComboBoxModelObject.java
 */

package com.xxxx.xxxx.Library;

/**
 * ResultSet ComboBoxModel Object
 * @author Yo
 * @version 1.0
 */
public class ResultSetComboBoxModelObject {

    private Integer codigo;
    private String descri;

    public ResultSetComboBoxModelObject(Integer codigo, String descri) {
        this.codigo = codigo;
        this.descri = descri;
    }

    @Override
    public String toString() {
        return this.getDescri();
    }

    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public String getDescri() {
        return descri;
    }

    public void setDescri(String descri) {
        this.descri = descri;
    }
}
El modelo que se adjunta al ComboBox.

Código:
/*
 * ResultSetComboBoxModel.java
 */

package com.xxxx.xxxx.Library;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.ComboBoxModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

/**
 * ResultSet ComboBoxModel
 * @author Yo
 * @version 1.0
 */
public class ResultSetComboBoxModel implements ComboBoxModel {

    private Vector<ResultSetComboBoxModelObject> data = new Vector<ResultSetComboBoxModelObject>();
    private Vector<ListDataListener> list = new Vector<ListDataListener>();
    private ResultSetComboBoxModelObject selectedItem;

    public ResultSetComboBoxModel(ResultSet r, String codigo, String descri) throws SQLException {
        r.beforeFirst();
        while (r.next()) {
            data.add(new ResultSetComboBoxModelObject(r.getInt(codigo), r.getString(descri)));
        }
    }

    public ResultSetComboBoxModelObject searchSelectedItem(Integer i) {
        for (ResultSetComboBoxModelObject o : data) {
            if (i.equals(o.getCodigo())) {
                return o;
            }
        }
        return null;
    }

    public ResultSetComboBoxModelObject searchSelectedItem(String s) {
        for (ResultSetComboBoxModelObject o : data) {
            if (s.equals(o.getDescri())) {
                return o;
            }
        }
        return null;
    }

    public void setSelectedItem(Object anItem) {
        selectedItem = anItem instanceof ResultSetComboBoxModelObject ? (ResultSetComboBoxModelObject) anItem : null;
        for (ListDataListener l : list) {
            l.contentsChanged(new ListDataEvent(this, javax.swing.event.ListDataEvent.CONTENTS_CHANGED, 0, 0));
        }
    }

    public Object getSelectedItem() {
        return selectedItem;
    }

    public int getSize() {
        return data.size();
    }

    public Object getElementAt(int index) {
        return data.get(index);
    }

    public void addListDataListener(ListDataListener l) {
        list.add(l);
    }

    public void removeListDataListener(ListDataListener l) {
        list.remove(l);
    }

    public Integer getSelectedCodigo() {
        return selectedItem == null ? null : selectedItem.getCodigo();
    }

    public String getSelectedDescri() {
        return selectedItem == null ? null : selectedItem.getDescri();
    }
}
Y la forma de usarlo ...

Código:
jComboBox1 = new com.xxxx.xxxx.Library.JComboBox();
jComboBox1.setModel(new ResultSetComboBoxModel(MyResultSet.executeQuery(), "codtar", "destar"));
// Aquí MyResultSet es un callable statement que regresa un ResultSet, "codtar" y "destar" son
los nombres de los campos en la base de datos.
para obtener el código del item seleccionado ...

Código:
((ResultSetComboBoxModelObject)jComboBox1.getSelectedItem()).getCodigo()
getSelectedItem puede ser nulo.
para seleccionar un item por el código (por ejemplo 100) ...

Código:
jComboBox1.setSelectedItem(((ResultSetComboBoxModel)jComboBox1.getModel()).searchSelectedItem(100));
para seleccionar ningún codigo ...

Código:
jComboBox1.setSelectedItem(null);
Saludos,

Última edición por HackmanC; 06/03/2008 a las 15:42 Razón: edit
  #3 (permalink)  
Antiguo 06/03/2008, 09:24
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: rellenar combo box

Si tienes el combo cargado con objetos lo unico q tienes q hacer es redefirnir el toString de la clase
public String toString(){
return dato + " - " + dato2;
}

saludos
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #4 (permalink)  
Antiguo 06/03/2008, 15:47
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Sonrisa Re: rellenar combo box

Whow! ... entonces definitivamente yo leí mal.

Cita:
...La tabla con la que quiero rellenar el combo tiene un id como clave primaria, numérico, pero lo que quiero mostrar en el combo box es el nombre...

...La cuestión está en que me gustaría que el combo mostrase unos datos pero tomase como valor el id correspondiente y no encuentro la manera de hacerlo...
Yo entendí ...

ComboBox despliega "Visa", "Master Card", "Discovery".
Pero necesitas guardar en la base de datos 1, 2, 3.

Que no es lo mismo ...

ComboBox despliega "1 - Visa", "2 - Master", "3 - Discovery"


Voy a dejar mi post anterior ... tal ves a alguien le sirva más adelante.
Y voy a leer mejor las preguntas de aquí en adelante.

Disculpas y Saludos,
  #5 (permalink)  
Antiguo 08/03/2008, 02:28
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 17 años
Puntos: 2
Re: rellenar combo box

Jajajaja, gracias de veras.
Soy muy novatilla en esto de java y vi tan complicado lo que me pusiste que opté por la vía fácil.
Como solamente es una practiquilla para subir nota en una asignatura quité el campo id de la tabla correspondiente y puse el nombre como primary key y en la tabla que le hace referencia hice lo mismo, cambie el id por el nombre.
Pero de todas formas, tampoco quería mostrar "id-nombre", realmente quería mostrar sólo nombre y exactamente hackmanc, quería guardar en la tabla id.
Gracias de todos modos
  #6 (permalink)  
Antiguo 09/03/2008, 18:49
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: rellenar combo box

a ver una critica constructiva no te aconsejo q pongas una clave de tipo string en una bd a lo mejor si fuera comparitida con un numero ya que puedes perder integridad, lo mejor son usar los autonumericos, y tampoco era necesario borrar la clave si trabajas con objetos en el toString ponias solo el nombre y ya esta se el combox tiene un metodo getSelectedItem() q te devuelve el objeto entero
saludos
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #7 (permalink)  
Antiguo 10/06/2008, 16:44
 
Fecha de Ingreso: junio-2008
Mensajes: 4
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: rellenar combo box

HackmanC
Se agradece el código. Funciona de pelos.
Muchas gracias!
Saludos!
Roberto
  #8 (permalink)  
Antiguo 21/07/2008, 12:16
 
Fecha de Ingreso: julio-2008
Mensajes: 14
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: rellenar combo box

una pregunta, en k momento haces la consulta a la bd sobre k tabla vas a utilizar?? =/
  #9 (permalink)  
Antiguo 21/07/2008, 18:35
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Sonrisa Respuesta: rellenar combo box

Hola,

La clase "ResultSetComboBoxModel" recibe el ResultSet previamente lleno con los datos y lo único que hace con dichos datos es copiarlos a un Vector. Por lo tu tienes que proveerle el ResultSet .. en otro lado (que no está aquí, por que no es el objetivo de la clase) haces la conexión, el SELECT, etc.

Si necesitas más información sobre como crear un ResultSet o como usar executeQuery(), crea un nuevo "hilo" o busca información sobre los ResultSet's.

----------

El constructor de la clase ResultSetComboBoxModel recibe como primer parámetro un ResultSet, seguido de los nombres de dos campos de la consulta de base de datos:
Código:
    public ResultSetComboBoxModel(ResultSet r, String codigo, String descri) throws SQLException {
En el ejemplo de la forma de uso, hay un objecto llamado MyResultSet que llama a la función executeQuery() para devolver un ResultSet lleno con los datos de dos campos llamados "codtar (codigo)" y "destar (descripción)":
Código:
jComboBox1 = new com.xxxx.xxxx.Library.JComboBox();
jComboBox1.setModel(new ResultSetComboBoxModel(MyResultSet.executeQuery(), "codtar", "destar"));
Saludos,

ps:
Lástima ... el mensaje de robertop, me gustaba para ser el último mensaje de este thread. XD

Última edición por HackmanC; 21/07/2008 a las 19:11 Razón: cleanup
  #10 (permalink)  
Antiguo 25/07/2008, 16:37
 
Fecha de Ingreso: julio-2008
Mensajes: 14
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: rellenar combo box

definitivamete tu post esta de maravilla, muy explicado y todo, pasa k soy un poco autodidacta recien estoy empezando a ver java y no capto muy bien aun algunas cosas, ahora, intente hace unos dias krear yo mismo mi result set e hice esto:

try {

String query1 = ("select id_tip_pers, tipo_persona from tip_pers");
PreparedStatement psquery = (PreparedStatement) cn.prepareStatement(query1);
while(rs.next()){
cb1.addItem(rs.getString("id_tip_pers_FK"));
}
}
catch(Exception ex){
JOptionPane.showMessageDialog(this, "Error " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
}

este codigo me funciona, pero solo me muestra el codigo, intente implementar tu codigo pero la verdad no soy tan bueno que digamos en java (recien lo estoy aprendiendo) y nunca pude hacerlo funcionar :(( me falto lo ultimo k decias tu implementarlo kon el select y el result set adecuado, si puedieras ayudarme kon ese ultimo detalle te lo agradeceria mucho :DD

Última edición por never20; 25/07/2008 a las 17:23
  #11 (permalink)  
Antiguo 26/07/2008, 12:29
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Mensaje Respuesta: rellenar combo box

Hola,

Cita:
Iniciado por never20 Ver Mensaje
... e hice esto: ...

try {

String query1 = ("select id_tip_pers, tipo_persona from tip_pers");
PreparedStatement psquery = (PreparedStatement) cn.prepareStatement(query1);
while(rs.next()){
cb1.addItem(rs.getString("id_tip_pers_FK"));
}
}
catch(Exception ex){
JOptionPane.showMessageDialog(this, "Error " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
}

este codigo me funciona, ...
Supongo que el código que pusiste es solo un extracto del código completo, no hay una conexión. Pero suponiendo que funciona ... el reccordset es "rs".

Por consiguiente crearias el ComboBox de esta forma:

jComboBox1 = new JComboBox();
jComboBox1.setModel(new ResultSetComboBoxModel(rs, "id_tip_pers", "tipo_persona"));

Donde rs es el RecordSet con los datos de la consulta SQL que pusiste, "id_tip_pers" es un campo de tipo int, y "tipo_persona" es un varchar.

Saludos,
  #12 (permalink)  
Antiguo 11/03/2011, 10:39
Ktulu
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Re: rellenar combo box

Cita:
Iniciado por djagu_26 Ver Mensaje
Si tienes el combo cargado con objetos lo unico q tienes q hacer es redefirnir el toString de la clase
public String toString(){
return dato + " - " + dato2;
}

saludos
Hola, es exactamente lo que estoy necesitando.

En mi caso lleno el jCombobox con objetos de tipo Provincias traidos desde una BD (mediante una clase entidad) donde sus atributos son ID y DESCRIPCION.
Por algun motivo los items se muestran como nombrePaquete.nombreClase(id=idRegistro) en lugar de ver la descripción. Según la información que encontré lo ideal es como decís: redefinir el método toString del combobox para mostrar lo que a mi me interesa.
Si no me equivoco lo que necesitaría es crear una clase modelo donde se redefina ésto y setearle éste modelo a dicho combobox.
Mi duda es: la clase debe ser implements ComboBoxModel o extend ComboBoxModel ? Debo redefinir todos los metodos o solo el toString ?
Debo tener en cuenta que necesito OBLIGADAMENTE almacenar el objeto completo en cada item pero solo mostrar uno de sus atributos.
Estoy un poco frustrado con esto ya que hace 2 días que lo estoy intentando y no lo consigo
Un saludo
  #13 (permalink)  
Antiguo 09/01/2013, 14:17
 
Fecha de Ingreso: octubre-2012
Ubicación: Circasia-Quindio
Mensajes: 6
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Re: rellenar combo box

Muchas Gracias .. Funciona perfecto.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 3 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 08:18.