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

1voto

Obtener el valor de JButton dinámico

Buenas tardes compañeros, estoy realizando un proyecto donde quiero que todo sea dinámico a través de datos obtenido de la BD (Los que ya me conocéis sabéis que todo lo he aprendido de ustedes y os estoy muy agradecido) :) :) :)

Sin mas dilación procedo a poner la parte de código que tengo:

//Creamos la categoría para recoger las familias de los productos
        try {
            rs = objConex.familiasProductos();
            columna = 367;
            fila = 249;
            int x=1;
            while (rs.next()) {
                botonFProducto = new JButton(rs.getString("NOMBRE"));
                botonFProducto.setBounds(columna, fila, 125, 80);
                contentPane.add(botonFProducto);
                x++;
                columna += 130;
            }
            if (botonFProducto == null) {
                System.out.println("No hay contenido");
            } else {
                botonFProducto.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent arg0) {
                        Object ValorBoton = botonFProducto.getText();
                        System.out.println(ValorBoton);
                    }
                });
            }

        } catch (SQLException e1) {
            e1.printStackTrace();
        }

PARTE SQL

public ResultSet familiasProductos() {
        try {
            stm = conex.createStatement();
            String cadSQL = "";
            cadSQL = "SELECT NOMBRE FROM FAMILIA_PRODUCTOS";
            rs = stm.executeQuery(cadSQL);
            System.out.println(cadSQL);
            return rs;
        } catch (SQLException ex) {
            Logger.getLogger(ConexionDB.class.getName()).log(Level.SEVERE,null, ex);
            JOptionPane.showMessageDialog(null,"Hubo un problema en la base de datos\n Contacte con el administrador");
        }
        return null;
    }

Mi problema, mi desconocimiento, viene a la hora de intentar obtener el valor del JButton según yo clique en él, indiferentemente de los haya, con este código lo que consigo es obtener el valor del último JButton generado.

¿Que se os ocurre?

EDITO:

Bueno, la idea es la siguiente: con esta consulta obtengo desde la base de datos la cantidad de familias de productos y, luego con esta información, al pulsar en cada botón se debe obtener el nombre de la familia para realizar una consulta SQL posterior y obtener los productos dentro esa familia en cuestión.

Es decir, yo pulso en Refrescos, pues genero un Select productos from FAMILIA_PRODUCTOS where nombre= 'refrescos"; como ejemplo, entonces me saldrán todos los productos dentro de esa familia para poder obtener de manera dinámica todos los productos relacionados e imprimirlos por pantalla...

3 Respuestas

-1voto

Yesod Puntos3550

Hago una nueva respuesta para mostrar el resultado final, ha sido una mezcla entre mi código y el del compañero :)

// Creamos la categoría para recoger las familias de los productos
        try {
            rs = objConex.familiasProductos();
            columna = 367;
            fila = 249;
            int x=1;
            while (rs.next()) {
                botonFProducto = new JButton(rs.getString("NOMBRE"));
                botonFProducto.setBounds(columna, fila, 125, 80);
                contentPane.add(botonFProducto);
                x ++;
                columna += 130;
                botonFProducto.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        JButton obj = (JButton)e.getSource();
                        String nombre = obj.getText();
                        System.out.println(nombre);
                        /*Object ValorBoton = botonFProducto.getText();
                        System.out.println(ValorBoton);*/
                    }
                });
            }
        } catch (SQLException e1) {
            e1.printStackTrace();
        }

Muchas gracias :)

1voto

Javi2EE Puntos6630

El problema es que estas añadiendo el actionListener fuera del bucle, al salir del bucle el objeto botonFProducto únicamente contiene el valor asignado en la última iteración, deberías moverlo dentro del bucle, para recoger el valor de cada boton lo suyo es que crees una clase distinta para recoger los valores y aplicar la lógica, un ejemplo de como podrías hacer esto es así:

class ButtonListener implements ActionListener {
  ButtonListener() {
  }

  public void actionPerformed(ActionEvent e) {
    JButton o = (JButton)e.getSource(); //haciendo casting obtienes el boton
    String nombre = o.getName(); //asi obtienes el nombre del boton
    if(nombre.equals("refrescos"){
       //ejecutar logica asociada al boton
    }else if(nombre.equals("cafes"){
       // asi sigues aplicando una accion a cada boton
    }
  }
}
ButtonListener listener = new ButtonListener();
try {
            rs = objConex.familiasProductos();
            columna = 367;
            fila = 249;
            int x=1;
            while (rs.next()) {
                botonFProducto = new JButton(rs.getString("NOMBRE"));
                botonFProducto.setBounds(columna, fila, 125, 80);
                contentPane.add(botonFProducto);
                x++;
                columna += 130;
                botonFProducto.addActionListener(listener);
            }
        } catch (SQLException e1) {
            e1.printStackTrace();
        }

Así añades un actionListener a cada uno de los botones que creas, no solo al último y desde la clase buttonListener obtienes su valor

Un saludo

0voto

Yesod comentado

Si hago eso, solo recojo el valor del último botón...clique donde clique, me has solucionado el 50% del problema :) Gracias compi :)

0voto

Javi2EE comentado

¿Cual es el otro 50%? :)

0voto

Yesod comentado

Que recoja el valor de cada botón, no solo el del último botón

Se supone que los valores que recoge son:
Refrescos
Cafés
Postres
Vinos

Al pulsar en cualquiera de los botones solo me recoge el último

0voto

Javi2EE comentado

Ya he editado mi respuesta, así deberia funcionarte

0voto

Yesod comentado

El tema es que esos datos son recogidos de la base de datos, lo que intento es que, sin saber que contenido puedo obtener, consiga el valor de los botones.

PD: Tu código no resulta, no me sale nada en pantalla...

0voto

Javi2EE comentado

El código funciona aunque hay cosas que no incluye ya que en tu pregunta no las habías incluido y he querido dar una respuesta basándome en en código que has publicado, si quieres pon el resto de código que te falta y te digo donde esta fallando.

0voto

Yesod comentado

No hay mas código...Es solo una generación de Botones de forma dinámica a través de la respuesta de un SQL...

Tu código he hecho copy-paste y no me ha dado resultado poniendo System.out.println();...

0voto

Javi2EE Puntos6630

Se te despliega el Jpanel? Recibes la consulta SQL? en ese codigo si haces System.out.println(nombre); te imprime null en la consola ya que no le has asignado ningun nombre a los botones, pero estas recibiendo el boton desde el metodo actionPerformed() y de el puedes obtener cualquier atributo que quieras, desde su nombre hasta cualquier componente que le hayas asociado. El código lo he probado y funciona.

0voto

Javi2EE comentado

La clase es el archivo .java donde has escrito el código que has publicado. Pon toda la clase entera

0voto

Yesod comentado

Es en el método main, si te digo que no hay mas clase que eso es porque es asi, no hay mas código que el que te he pasado...es un contentpane(); donde mediante una SQL se recoge todo y lo demás por línea de código, es decir, después de eso, simplemente hay un System.out.print para imprimir los resultados. No se que mas quieres que te ponga...si es que no hay mas código que el que he puesto...

0voto

Javi2EE comentado

Lo que quiero es que pegues la clase completa desde la linea 1 hasta el final incluyendo la cabecera y todos los atributos. Es importante saber donde creas cada objeto porque cada variable tiene un alcance distinto en función de donde la has creado.

0voto

Javi2EE comentado

Donde estas instanciando(hacer new) a la variable objConex y la variable rs? si ese es todo el código no me explico que alguna vez haya podido funcionar

0voto

Yesod comentado

Es todo el código que hay, para que puedas copiar y pegar, a ver si me puedes echar un cable...

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import conexion.ConexionDB;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;

public class prueba extends JFrame {

    private JPanel contentPane;
    // Instanciamos la conexión
    public static ConexionDB objConex = new ConexionDB();
    static ResultSet rs;

    // Generación dinámica para los botones
    int columna, fila;
    Object ObtenerValor;
    private JButton botonFProducto;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    prueba frame = new prueba();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public prueba() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 550, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        GroupLayout gl_contentPane = new GroupLayout(contentPane);
        gl_contentPane.setHorizontalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGap(0, 424, Short.MAX_VALUE)
        );
        gl_contentPane.setVerticalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGap(0, 252, Short.MAX_VALUE)
        );
        contentPane.setLayout(gl_contentPane);

        // Creamos la categoría para recoger las familias de los productos
        try {
            rs = objConex.familiasProductos();
            columna = 0;
            fila = 0;
            int x = 1;
            while (rs.next()) {
                botonFProducto = new JButton(rs.getString("NOMBRE"));
                botonFProducto.setBounds(columna, fila, 125, 80);
                contentPane.add(botonFProducto);
                x++;
                columna += 130;
                botonFProducto.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent arg0) {
                        Object ValorBoton = botonFProducto.getText();
                        System.out.println(ValorBoton);
                    }
                });
            }
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    }

}

EDITO: Ya esta conseguido:

// Creamos la categoría para recoger las familias de los productos
        try {
            rs = objConex.familiasProductos();
            columna = 367;
            fila = 249;
            int x=1;
            while (rs.next()) {
                botonFProducto = new JButton(rs.getString("NOMBRE"));
                botonFProducto.setBounds(columna, fila, 125, 80);
                contentPane.add(botonFProducto);
                x ++;
                columna += 130;
                botonFProducto.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        JButton obj = (JButton)e.getSource();
                        String nombre = obj.getText();
                        System.out.println(nombre);
                        /*Object ValorBoton = botonFProducto.getText();
                        System.out.println(ValorBoton);*/
                    }
                });
            }
        } catch (SQLException e1) {
            e1.printStackTrace();
        }

Ya he conseguido que me de el valor de cada JButton para luego poder sacar los productos de esa familia. Gracias :)

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