Enviar el id de un Combobox pero mostrar el nombre

Hola!

Tengo un problema con un combobox. Tengo una clase que carga todos los datos de una BD, pero solo lo puedo hacer con una columna de la base de datos, y lo que quiero hacer es algo como esto:

Opción 1 Opción 2

Esta es mi función para obtener los registros:

[code]
public IndexedContainer cargaZonas(){

    ResultSet rs = consultazonas.obtenerRegistros();
    IndexedContainer t = new IndexedContainer();
    
    try {while (rs.next()) {
        t.addItem(rs.getString(2));
    }
        
    } catch (UnsupportedOperationException e) {
        
        e.printStackTrace();
        
    } catch (SQLException e) {
        
        e.printStackTrace();
        
    }
    return t;

}
[/code]Y así lleno el combobox:

franja_horaria = new ComboBox();
        franja_horaria.setContainerDataSource(cargafranjas.cargaZonas());

Tal vez necesitas algo como lo siguiente:

String itemId = rs.getString(1); // usando el tipo e índice de columna apropiados
String caption = rs.getString(2);

comboBox.addItem(itemId);
comboBox.setItemCaption(itemId, caption);

Hola, estoy tratando de hacer lo que me indicas, pero no se donde colocar el
comboBox.setItemCaption(itemId, caption);

Esta es la función de la clase que carga los datos en el combobox:

[code]
public IndexedContainer cargaZonas(){

    ResultSet rs = consultazonas.obtenerRegistros();
    IndexedContainer t = new IndexedContainer();
    
    try {while (rs.next()) {
        String itemId = rs.getString(2);
        String caption = rs.getString(3);
        t.addItem(itemId);
    }
        
    } catch (UnsupportedOperationException e) {
        
        e.printStackTrace();
        
    } catch (SQLException e) {
        
        e.printStackTrace();
        
    }
    return t;
}

[/code]Y esta es la clase vista que tiene el combobox y llama a la función anterior:

franja_horaria = new ComboBox();
franja_horaria.setContainerDataSource(cargafranjas.cargaZonas());
mainLayout.addComponent(franja_horaria, "top:45.0%;left:83.0%");

Hola,

La solución que propuse no requiere que uses un
Container
de forma directa, pero requieres de una referencia al
ComboBox
para llamar a
addItem
y
setItemCaption
.

Saludos!

Y en mi caso cómo sería? Necesito agregar el caption al Container y llamarlo desde el Combobox? Disculpa pero soy nuevo en Vaadin y no manejo mucho Java

Algo como:

public void cargaZonas(ComboBox comboBox) {

    ...

    String itemId = rs.getString(1); // usando el tipo e índice de columna apropiados
    String caption = rs.getString(2);

    comboBox.addItem(itemId);
    comboBox.setItemCaption(itemId, caption);    

    ...
}

...

    cargaZonas(franja_horaria);

...

Hola! He puesto el código pero el ComboBox no me muestra nada, me quedó de la siguiente forma:

ConsultaFranjasCombobox (Modelo):

[code]
public class ConsultaFranjasCombobox {

Conexion conexion = new Conexion();

public ResultSet obtenerRegistros(){
    PreparedStatement pst = null;
    ResultSet rs = null;
    
    Connection conn = conexion.crear();
    String sql = "SELECT * FROM \"FranjasHorarias\"";
    try {
        pst = conn.prepareStatement(sql);
        rs = pst.executeQuery();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
    return rs;
}

}
[/code]cargaFranjasCombobox (Controlador):

[code]
public class cargaFranjasCombobox {

ConsultaFranjasCombobox consultafranjas = new ConsultaFranjasCombobox();

public IndexedContainer cargaZonas(ComboBox combobox){

    ResultSet rs = consultafranjas.obtenerRegistros();
    IndexedContainer t = new IndexedContainer();
    
    try {
        while (rs.next()) {
            Integer itemId = rs.getInt(2);
            String caption = rs.getString(3);

            combobox.addItem(itemId);
            combobox.setItemCaption(itemId, caption);  
            
        }
    } catch (UnsupportedOperationException e) {
        
        e.printStackTrace();
        
    } catch (SQLException e) {
        
        e.printStackTrace();
        
    }
    return t;
}

}
[/code]FranjaCombobox (Vista):

cargaFranjasCombobox cargafranjascb = new cargaFranjasCombobox();

franja_horaria = new ComboBox();
franja_horaria.setImmediate(true);
franja_horaria.setContainerDataSource(cargafranjascb.cargaZonas(franja_horaria));

No necesitas el Container ni llamar a setContainerDataSource.

Ahora si me resultó!

Muchas gracias por tu ayuda!

Tema solucionado!