Java - La accion no ocurre al presionar el Jbutton si no al presionar un JComobBox

 
Vista:
sin imagen de perfil

La accion no ocurre al presionar el Jbutton si no al presionar un JComobBox

Publicado por Jaime (4 intervenciones) el 26/02/2024 20:25:10
Hola, ante todo pedir disculpas por los fallos que pueda cometer, es la primera vez que participo en un foro.
Despues, agradecer de antemano la ayuda que me deis.
Tego un codigo con un Actionlistenr asociado a u JButon, pero la acción no se jecutacompletamente al presionar el JButton si no al presionar, despues en un JComboBox de que tiene que tomar el SelectItem para hacer la accion.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package controlador;
 
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
 
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
 
import modelo.Conexion;
 
import vista.*;
 
 
public class ListarTabla implements ActionListener {
 
	Conexion miConexion = new Conexion();
 
	public void actionPerformed(ActionEvent e) {
 
		Connection conecta = miConexion.dameConexion(); // INSTANCIAMOS EL METODO DE DENTRO DE CONEXION QUE NOS DA LA CONEXION
 
		try {
 
			Statement miStatement = conecta.createStatement(); //CREAMOS EL STATEMENT
			ResultSet rs = miStatement.executeQuery("SELECT * FROM " + LaminaDDBB.Desplegable.getSelectedItem()); // CREAMOS EL RESULTSET
			//LlenarTabla.LlenarNombresColumnas(rs);
			// Crear el modelo de la tabla
			DefaultTableModel model = new DefaultTableModel();
 
			try { // Recorrer el ResultSet y añadir los datos al modelo
			    ResultSetMetaData rsmd = rs.getMetaData();// Obtener los metadatos del ResultSet
			    int columnCount = rsmd.getColumnCount();// Obtener el número de columnas
			    String[] columnNames = new String[columnCount];// Crear un array para los nombres de las columnas
 
			    for (int i = 0; i < columnCount; i++) { // Rellenar el array con los nombres de las columnas
			        columnNames[i] = rsmd.getColumnName(i + 1);
 
			    }
 
			    model.setColumnIdentifiers(columnNames);// Añadir el array con los nombres de las columnas  al modelo como cabecera
			    Object[] rowData = new Object[columnCount];// Crear un array para los valores de las filas
			    while (rs.next()) { // Recorrer el ResultSet
 
			        for (int i = 0; i < columnCount; i++) { // Rellenar el array con los valores de las columnas
 
			            rowData[i] = rs.getObject(i + 1);
 
			        }
			        model.addRow(rowData);// Añadir el array al modelo como nueva fila
 
			    }
			} catch (SQLException e1) {
			    e1.printStackTrace();
			}
			if (LLeno) {
				MarcoBBDD.miLamina.remove(scrollPane); // Eliminamos la tabla solo si existe
				System.out.println("boramso scroll");
			}
 
			JTable table = new JTable(model);// Crear la tabla con el modelo
			scrollPane = new JScrollPane(table);// Crear el scroll pane con la tabla
			scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);// ELEJIMOS CUANDO APARECE EL SCROLL
			scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
			MarcoBBDD.miLamina.add(scrollPane, BorderLayout.CENTER);
			LLeno = true;
 
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			System.out.println("Fallo");
		}
	}
 
	JScrollPane scrollPane;
	Boolean LLeno = false;
}

Si alguien pudiera decirme que estoy haciendo mal.

Todo es llamado desde la lamina
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package vista;
 
import modelo.*;
import controlador.*;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
 
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.*;
 
public class LaminaDDBB extends JPanel {
 
	public LaminaDDBB () {
 
 
		setLayout(new BorderLayout());
		Desplegable = new JComboBox();
		Blistar = new JButton("Listar");
		JPanel LaminaMenu = new JPanel();
		LaminaMenu.setLayout(new FlowLayout());
 
 
 
		ListarTabla ListarT = new ListarTabla(); // INSTANCIAMOS EL METODO QUE LE DA LA ACCION AL BOTON
		Blistar.addActionListener(ListarT); //AL BOTON LE DAMOS SU ACCION
		Desplegable.setPreferredSize(new Dimension(220,30));
		Blistar.setPreferredSize(new Dimension(100,30));
		RellenaDesplegable.Rellena(); //LLAMAMOS AL METODO QUE NOS RELLENA EL DESPLEGABLE
 
 
		LaminaMenu.add(Desplegable);
		LaminaMenu.add(Blistar);
 
		add(LaminaMenu, BorderLayout.NORTH);
 
	}
 
 
	static public JComboBox Desplegable;
	static public JButton Blistar;
}

El desplegable se rellena con el siguiente codigo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package modelo;
 
import java.sql.*;
 
import controlador.CapturaConexion;
import vista.*;
 
public class RellenaDesplegable {
 
	public static  void  Rellena() {
		miConexion = new Conexion(); //INSTANCIAMOS EL METODO DE LA CONEXION
		Connection accesoBBDD = miConexion.dameConexion(); // INSTANCIAMOS EL METODO DE DENTRO DE CONEXION QUE NOS DA LA CONEXION
 
		try {
 
			DatabaseMetaData datosBBDD = accesoBBDD.getMetaData(); // METEMOS EN datosBBDD LOS METADATOS DE LA BASE DE DATOS
			miResulset = datosBBDD.getTables(CapturaConexion.nombreBBDD, null, null, null); // CREAMOS LA TABLA VIRTUAL "RESULTSET" CON LAS TABLAS DE LA BBDD
			while ( miResulset.next()) { // RECORREMOS EL RESULTSET
				LaminaDDBB.Desplegable.addItem(miResulset.getString("TABLE_NAME")); // METEMOS EN EL DESPLEGABLE TODAS LAS TABLAS
			}
 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
	}
 
	static Conexion miConexion;
	public static ResultSet miResulset;
}

Por favor corregir los fallos que haya cometido al hacer la pregunta sin tomarmelo en cuenta.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

La accion no ocurre al presionar el Jbutton si no al presionar un JComobBox

Publicado por Billy Joel (876 intervenciones) el 27/02/2024 05:14:47
En tu clase ListarTabla lo único que veo es que no cierras las conecciones a la base de datos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import modelo.Conexion;
import vista.*;
 
public class ListarTabla implements ActionListener {
 
    Conexion miConexion = new Conexion();
 
    JScrollPane scrollPane;
    Boolean LLeno = false;
 
    public void actionPerformed(ActionEvent e) {
        Connection conecta = miConexion.dameConexion(); // INSTANCIAMOS EL METODO DE DENTRO DE CONEXION QUE NOS DA LA CONEXION
        try {
            Statement miStatement = conecta.createStatement(); //CREAMOS EL STATEMENT
            ResultSet rs = miStatement.executeQuery("SELECT * FROM " + LaminaDDBB.Desplegable.getSelectedItem()); // CREAMOS EL RESULTSET
            //LlenarTabla.LlenarNombresColumnas(rs);
            // Crear el modelo de la tabla
            DefaultTableModel model = new DefaultTableModel();
            try { // Recorrer el ResultSet y añadir los datos al modelo
                ResultSetMetaData rsmd = rs.getMetaData();// Obtener los metadatos del ResultSet
                int columnCount = rsmd.getColumnCount();// Obtener el número de columnas
                String[] columnNames = new String[columnCount];// Crear un array para los nombres de las columnas
                for (int i = 0; i < columnCount; i++) { // Rellenar el array con los nombres de las columnas
                    columnNames[i] = rsmd.getColumnName(i + 1);
                }
                model.setColumnIdentifiers(columnNames);// Añadir el array con los nombres de las columnas  al modelo como cabecera
                Object[] rowData = new Object[columnCount];// Crear un array para los valores de las filas
                while (rs.next()) { // Recorrer el ResultSet
                    for (int i = 0; i < columnCount; i++) { // Rellenar el array con los valores de las columnas
                        rowData[i] = rs.getObject(i + 1);
                    }
                    model.addRow(rowData);// Añadir el array al modelo como nueva fila
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            if (LLeno) {
                MarcoBBDD.miLamina.remove(scrollPane); // Eliminamos la tabla solo si existe
                System.out.println("boramso scroll");
            }
            JTable table = new JTable(model);// Crear la tabla con el modelo
            scrollPane = new JScrollPane(table);// Crear el scroll pane con la tabla
            scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);// ELEJIMOS CUANDO APARECE EL SCROLL
            scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            MarcoBBDD.miLamina.add(scrollPane, BorderLayout.CENTER);
            LLeno = true;
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            System.out.println("Fallo");
        } finally {
            try {
                if (conecta != null && !conecta.isClosed()) {
                    conecta.close();
                }
            } catch (SQLException ex) {
                ex.printStackTrace(System.out);
            }
        }
    }
}


¿Que error te sale?

Saludos,
Billy Joel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

La accion no ocurre al presionar el Jbutton si no al presionar un JComobBox

Publicado por Jaime (4 intervenciones) el 27/02/2024 07:32:26
Muchas gracias por contestar tan rápido.
No me muestra ningún error.
El problema es el siguiente:
El actionlistener esta vinculado al Blistar un JButton. Antes de enviar la pregunta, llene el actionperformen de System.out.println para comprobar por donde pasaba el programa, y pasa por todas las líneas. Sin embargo, no muestra el scroll con el jtable hasta que vuelvo a pulsar sobre el desplegable. Y así todos los intentos, elimina el scroll del JPanel y muestra la tabla nueva, pero cuando pulso sobre el Jcombobox. Y me estoy volviendo loco.
Osea, al pulsar sobre Blistar me muestra todos los System.Out.println, pero la tabla la muestra al volver a pulsar sobre el desplegable.

También tienes razón que se me ha olvidado cerrar conexión...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

La accion no ocurre al presionar el Jbutton si no al presionar un JComobBox

Publicado por Billy Joel (876 intervenciones) el 27/02/2024 14:06:55
Sospecho que pasa lo siguiente al arrancar el app.
- No se muestra el panel con la tabla.
- Se presiona el botón y se muestra la tabla
- Se presiona el botón y se comporta raro...

Creo saber por donde va... en un momento va la solución
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

La accion no ocurre al presionar el Jbutton si no al presionar un JComobBox

Publicado por Billy Joel (876 intervenciones) el 27/02/2024 14:34:51
La clase LaminaDDBB quedaría así

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import modelo.*;
import controlador.*;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class LaminaDDBB extends JPanel {
    public LaminaDDBB() {
        setLayout(new BorderLayout());
        Desplegable = new JComboBox();
        Blistar = new JButton("Listar");
        JPanel LaminaMenu = new JPanel();
        LaminaMenu.setLayout(new FlowLayout());
        ListarTabla ListarT = new ListarTabla(); // INSTANCIAMOS EL METODO QUE LE DA LA ACCION AL BOTON
        Blistar.addActionListener(ListarT); //AL BOTON LE DAMOS SU ACCION
        Desplegable.setPreferredSize(new Dimension(220, 30));
        Blistar.setPreferredSize(new Dimension(100, 30));
        RellenaDesplegable.Rellena(); //LLAMAMOS AL METODO QUE NOS RELLENA EL DESPLEGABLE
        LaminaMenu.add(Desplegable);
        LaminaMenu.add(Blistar);
        add(LaminaMenu, BorderLayout.NORTH);
 
        DefaultTableModel model = new DefaultTableModel(new String []{"COLUMNAS"}, 0);
        table = new JTable(model);
        JScrollPane scrollPane;
        scrollPane = new JScrollPane(table);// Crear el scroll pane con la tabla
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);// ELEJIMOS CUANDO APARECE EL SCROLL
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        add(scrollPane, BorderLayout.CENTER);
    }
 
    static public JComboBox Desplegable;
    static public JButton Blistar;
    static public JTable table;
}

Y la clase ListarTabla quedaría así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
//import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JScrollPane;
//import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import modelo.Conexion;
import vista.*;
 
public class ListarTabla implements ActionListener {
 
    Conexion miConexion = new Conexion();
 
//    JScrollPane scrollPane;
//    Boolean LLeno = false;
 
    public void actionPerformed(ActionEvent e) {
        Connection conecta = miConexion.dameConexion(); // INSTANCIAMOS EL METODO DE DENTRO DE CONEXION QUE NOS DA LA CONEXION
        try {
            Statement miStatement = conecta.createStatement(); //CREAMOS EL STATEMENT
            ResultSet rs = miStatement.executeQuery("SELECT * FROM " + LaminaDDBB.Desplegable.getSelectedItem()); // CREAMOS EL RESULTSET
            //LlenarTabla.LlenarNombresColumnas(rs);
            // Crear el modelo de la tabla
//            DefaultTableModel model = new DefaultTableModel();
            try {
//                // Recorrer el ResultSet y añadir los datos al modelo
//                ResultSetMetaData rsmd = rs.getMetaData();// Obtener los metadatos del ResultSet
//                int columnCount = rsmd.getColumnCount();// Obtener el número de columnas
//                String[] columnNames = new String[columnCount];// Crear un array para los nombres de las columnas
//                for (int i = 0; i < columnCount; i++) { // Rellenar el array con los nombres de las columnas
//                    columnNames[i] = rsmd.getColumnName(i + 1);
//                }
//                model.setColumnIdentifiers(columnNames);// Añadir el array con los nombres de las columnas  al modelo como cabecera
//                Object[] rowData = new Object[columnCount];// Crear un array para los valores de las filas
//                while (rs.next()) { // Recorrer el ResultSet
//                    for (int i = 0; i < columnCount; i++) { // Rellenar el array con los valores de las columnas
//                        rowData[i] = rs.getObject(i + 1);
//                    }
//                    model.addRow(rowData);// Añadir el array al modelo como nueva fila
//                }
                String [] cols = new String[rs.getMetaData().getColumnCount()];
                for (int i = 0; i < cols.length; i++) {
                    cols[i] = rs.getMetaData().getColumnName(i + 1);
                }
                List<Object[]> lData = new ArrayList<>();
                while(rs.next()){
                    Object[] row = new Object[cols.length];
                    for (int i = 0; i < cols.length; i++) {
                        row[i] = rs.getObject(i + 1);
                    }
                    lData.add(row);
                }
 
                Object [][] data = new Object [lData.size()][cols.length];
                for (int i = 0; i < data.length; i++) {
                    data[i] = lData.get(i);
                }
                MarcoBBDD.miLamina.table.setModel(new DefaultTableModel(data, cols));
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
//            if (LLeno) {
//                MarcoBBDD.miLamina.remove(scrollPane); // Eliminamos la tabla solo si existe
//                System.out.println("boramso scroll");
//            }
//            JTable table = new JTable(model);// Crear la tabla con el modelo
//            scrollPane = new JScrollPane(table);// Crear el scroll pane con la tabla
//            scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);// ELEJIMOS CUANDO APARECE EL SCROLL
//            scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
//            MarcoBBDD.miLamina.add(scrollPane, BorderLayout.CENTER);
//            LLeno = true;
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            System.out.println("Fallo");
        } finally {
            try {
                if (conecta != null && !conecta.isClosed()) {
                    conecta.close();
                }
            } catch (SQLException ex) {
                ex.printStackTrace(System.out);
            }
        }
    }
}

En lugar de crear y remover el scrollPane lo que hago es recargar el modelo de la tabla.
Eso debe corregir el problema.

Saludos,
Billy Joel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

La accion no ocurre al presionar el Jbutton si no al presionar un JComobBox

Publicado por Jaime (4 intervenciones) el 27/02/2024 18:04:56
Muchas gracias, hoy mismo lo pruebo y os cuento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

La accion no ocurre al presionar el Jbutton si no al presionar un JComobBox

Publicado por Jaime (4 intervenciones) el 28/02/2024 14:19:02
Osea, llevo yo 3 dias pegandome cabezazos contra la pared por este problema, y tu me lo solucionas sin despeinarte.
Muchas, muchas Gracias. Funciona a la perfeccion.
Un saludo, Espero algun dia oder ayudar yo a los demas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar