entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

ValueMember y DisplayMember en JAVA

Hola, buen día..

Tengo el siguiente problema, espero que me puedan ayudar.
Implemente en C# una consulta a la base de datos (MySQL) y lo guarde en un DATASET, con ello lleve el comboBox y utilice ValueMember y DisplayMember. Lo que pretendia es que me mostrara datos pero que al pedir cual selecciono me obtuviera el id. Comparto el codigo:

 DataSet ds = core.getSoftware();
            comboBox1.DataSource = ds.Tables[0];
            comboBox1.ValueMember = "id";
            comboBox1.DisplayMember = "nombre";

Sim embargo estoy haciendo la migracion a JAVA por cuestiones de compatibilidad de SO y me topo que no puedo hacer lo mismo, por el ValueMember y DisplayMember, como podria solucionarlo que no sea tan complejo.. Pensaba hacerlo en un JOptionPane pero creo que no funcionara y usare el jComboBox, pero ayudenme a implementarlo por favor.

Object color = JOptionPane.showInputDialog(null, "Seleccione Un Color", "COLORES", JOptionPane.QUESTION_MESSAGE,
                null, new Object[] { "Seleccione", "Amarillo", "Azul", "Rojo" }, "Rojo");

1 Respuesta

2votos

MitsuGami Puntos8010

Bien, en C# las cosas están mejor organizadas que en Java, por ende tendrás que hacer algunas cosillas extras.

1 Creación de entidad Categoria

Paquete modelo.entidades;

Crea una clase Categoria, que encapsula el id y la descripción de la misma.

public class Categoria {
    private int id;
    private String description;

    public Categoria() {

    }

    public Categoria(int id, String description) {
        this.id = id;
        this.description =  description;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return description;
    }

}

El método toString es importante ya que lo que retorna será lo que se muestre como valor en el combobox.

2 Consultando a la BBDD y parseando los registros a objetos Categoria

Paquete modelo.dao

Crea un método (de preferencia en una clase del Modelo no en la misma vista, ver principio SRP) que devuelva un List que contenga los datos de la consulta (id y descripción) envueltos en la clase Categoria.

public class CategoriaDao {

    public List<Categoria> getALl() {
        List<Categoria> categorias = new ArrayList<>();
        String sql = "SELECT id, descripcion FROM categorias";

        try (Connection conn = DBUtils.get();
             Statement stmt = conn.createStatement()){

            ResultSet rs = stmt.executeQuery(sql);

            while(rs.next()) {
                Categoria categoria = new Categoria();
                // 'id' y 'descripcion' son los nombres de las
                // columnas en la tabla 'categorias'
                categoria.setId(rs.getString("id"));
                categoria.setDescription(rs.getString("descripcion"));
            }
        } catch(SQLException e) {
            e.printStackTrace();
        }

        return categorias;
    }
}

Para obtener la conexión creamos una clase que nos la provea.

Paquete modelo.db

public class DBUtils {
    private static final String HOST = "jdbc:mysql://localhost:3306/";
    private static final String USER = "root";
    private static final String PASS = "";
    private static final String DB = "tu_bbdd";

    public Connection get() {
        Class.forName("com.mysql.jdbc.Driver");
        return DriverManager.getConnection(HOST + DB, USER, PASS);
    }
}

Ahora llama a éste método desde tu vista para ponerlos en el combo.

3. Añadiendo los objetos al ComboBox

Como no sé si usas Swing o JavaFX te pondré para ambos.

Swing

  1. Itera el List conteniendo los objetos Categoria.
  2. Agrega los valores al combobox.
CategoriaDao dao = new CategoriaDao();
// es el modelo de datos que acepta el combo
Vector<Categoria> modelo = new Vector<>(dao.getAll());
JComboBox cboCategorias = new JComboBox(modelo);

Y eso eso todo. Ahora, cuando obtengas un valor del combobox solo has un cast a Categoria:

cboCategorias.addActionListener(new ActionListener() {
     @Override public void actionPerformed(ActionEvent e) {
    JComboBox combo = (JComboBox) e.getSource();
    Categoria seleccionada =  (Categoria) combo.getSelectedItem();

    // hacer algo con la categoría seleccionada
    }
});

La razón de por qué hacer un cast a Categoria: (Categoria) combo.getSelectedItem(); es porque por defecto el método combo.getSelectedItem devuelve un objeto Object, entonces es necesario convertir el objecto Object a Categoria.

JavaFX

En JavaFX es más sencillo. Primero se debe crear una ObservableList que actuará como modelo de datos del combo.

CategoriaDao dao = new CategoriaDao();
private final ObservableList<Categoria> modelo =
                    FXCollections.observableArrayList<>(dao.getAll());

Y se lo añadimos al combo

ComboBox<Categoria> cboCategorias = new ComboBox<>(modelo);

Y eso es todo. El evento para el combobox de JavaFX es así:

cboCategorias.getSelectionModel().selectedItemProperty()
                            .addListener(new ChangeListener<Employee>() {

    @Override
    public void changed(ObservableValue<? extends Categoria> arg0, Categoria arg1, Categoria arg2) {
        if (arg2 != null) {
            Categoria seleccionada = arg2;
            // hacer algo con la categoría seleccionada
        }
    }
});

Espero te haya servido. Saludos.

0voto

ItIsJAPO comentado

Algo debo de estar haciendo mal. Me genera un exception:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at CategoriaRender.getListCellRendererComponent(Categoria.java:32)

Que es donde se hace:

 if (index == -1) {
            Categoria item = (Categoria) value;
            setText( "" + item.getId() );
        }

Disculpa por no especificar, trabajo con Swing. ¿Que podra ser?

0voto

MitsuGami comentado

Hola, al parecer entendí mal. Pensé que querías mostrar el ID y el Valor en el combo, pero por lo que veo quieres un combo estilo HTML, ¿cierto?

Checka mi actualización, ya no es necesario el Render.

0voto

ItIsJAPO comentado

Es correcto, pretendo mostrar valores en el combo, pero al obtenerlos darme los verdaderos "value" como en HTML que seria el ID...
Hasta la parte de llenarlo no me muentra error de sintaxis, pero no llena el combo, ya me cerciore de que si lo obtenga. No sera por que es un venctor?
yde ahi no comprendo como obtenerlo..
Me podrias explicar mas comentado como obtenerlo?
En esta parte salta en error despues de guadar y antes de coompilar

 Categoria seleccionada =  (JComboBox);e.getSelectedItem();

0voto

MitsuGami comentado

He actualizado mi respuesta explicando el porqué de: Categoria seleccionada = (Categoria) e.getSelectedItem();. Respecto a porqué no te llena el combo, ¿te has cerciorado qué el método getAll te esté devolviendo una List con contenido?

Puedes cerciorarte así:


List<Categoria> categorias = dao.getAll();

if(categorias.size() > 0) {
   Vector<Categoria> modelo = new Vector<>(categorias);
   cboCategorias = new JComboBox(modelo);
} else {
   JOptionPane.showMessageDialog(null, "No se encontraron categorías");
}

Si hay resultados pero aun así no te muestra los ítems en el combo, entonces itera la lista y agrega cada elemento a un vector.

Vector<Categoria> modelo = new Vector<>();
for(Categoria cat : categorias) {
    modelo.add(cat);
}
cboCategorias = new JComboBox(modelo);

0voto

ItIsJAPO comentado

Tampoco funciona, sin embargo he encontrado la solucionado.
en CategoriasDAO

antes que termine el while debe de meter lo que encontraste en la lista, se enciava vacia. Faltaba agregarle

categorias.add(categoria);

Pero me da un error en e.getSelectedItem(); al tratar de obtener el dato seleccionado del combo. Me ayudas?

0voto

ItIsJAPO comentado

Luego de muchos intentos, mucha lectura, por fin puedo concluir la solucion. En el codigo:

cboCategorias.addActionListener(new ActionListener() {
     @Override public void actionPerformed(ActionEvent e) {
    JComboBox combo = (JComboBox) e.getSource();
    Categoria seleccionada =  (Categoria) e.getSelectedItem();

    // hacer algo con la categoría seleccionada
    }
});

Debe de recuperarse asi:

cboCategorias.addActionListener(new ActionListener() {
     @Override public void actionPerformed(ActionEvent e) {
    JComboBox combo = (JComboBox) e.getSource();
    Categoria seleccionada =  (Categoria) combo .getSelectedItem();
    seleccionada.getId();//Este es el id que necesito
    // hacer algo con la categoría seleccionada
    }
});

0voto

MitsuGami comentado

Pero es exactamente lo que te puse. Lo único que debías hacer es operar con la categoría recuperada, que es lo que haces cuando escrbes: seleccionada.getId();. e.getSource() devuelve la fuente del evento, en este caso JComboBox y e.getSelectedItem(); devuelve el elemento seleccionado, en este caso Categoria. Como en ambos casos devuelve Object (superclase de todas las clases en Java) es necesario el casting.

0voto

ItIsJAPO comentado

Si, es correcto, pero el getSelectedItem() no es del ActionEvent, es de la instancia de JComboBox combo = (JComboBox) e.getSource();

1voto

MitsuGami comentado

Jaja oh shit cierto, cometí un pequeño error. Gracias por avisar ;)

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta