Tengo un problema y acudo ante los q saben mas de esto.
No soy tan experto en java, estoy aprendiendo y tengo un problema al insertar datos a una DB en MySQL, el problema es que el JTable no se actualiza.
La insersion en la DB se lleva a cabo sin problemas, pero la aplicación no muestra ese cambio, a menos que la vuelva a ejecutar. Utilizo las clases:
FORMACION DE LA TABLA:
Código Javascript:
Ver original
public class A_Tabla extends AbstractTableModel { //Constructor (un constructor creado con 3 parametros) y puede lanzar 2 tipos de excepciones A_Tabla(String controlador, String url, String consulta) throws SQLException, ClassNotFoundException { Class.forName(controlador); //asignamos a la clase el controlador A_Conexion.Cx = DriverManager.getConnection(url); //conector del constructor, recibira la url de la clase A_Interface A_SentenciasSQL.st = A_Conexion.Cx.createStatement(A_SentenciasSQL.resultado.TYPE_SCROLL_INSENSITIVE, A_SentenciasSQL.resultado.CONCUR_READ_ONLY); //statement creada con el resultset A_Conexion.DBConectado = true; //se habilita A_SentenciasSQL.establecerConsulta(consulta); //metodo que ejecuta la consulta } //Metodos de la tabla tipo AbstractTableModel, estos son metodos propios de //este tipo de tabla //Clase que representa el tipo de Columna public Class getColumnClass(int columna) throws IllegalStateException { ....... } //Obtener numero de columnas del objeto ResultSet public int getColumnCount() { ....... } //Nombre de una Columna específica del objeto Resultset public String getColumnName(int columna) { ....... } //Numero de filas public int getRowCount() //directamente este metodo cuenta las filas { .......... } public Object getValueAt(int fila, int col) { ...... }
CLASE PARA LA CONEXION
Código Javascript:
Ver original
public class A_Conexion { public static Connection Cx; //variable tipo conector public static boolean DBConectado = false; //variable booleana que indicara si esta o no conectado, como una bandera public static final String controladorJDBC = "com.mysql.jdbc.Driver"; //Controlador para conectarse con mysql //Parametros de la Base de Datos static String host = "localhost"; static String user = "giovanny"; static String pass = "giovanny"; static String db = "pruebajava"; static final String URL = "jdbc:mysql://" + host + "/" + db + "?" + "user=" + user + "&password=" + pass; //String de conexion //Cerrar objetos y controlar la desconexion public static void desCxDB() { try { //B_Consulta.st.close(); //cerrar el statement Cx.close(); //cierra la cx } catch(SQLException sqlEx) { System.out.println("Error de desconexion de la DB"); sqlEx.printStackTrace(); } finally { DBConectado = false; }
CLASES DE SENTENCIAS PARA SQL
Código Javascript:
Ver original
public class A_SentenciasSQL { public static ResultSet resultado; //variable tipo ResultSet public static ResultSetMetaData metaData; //MEtadata para almacenar la info general de la consulta public static Statement st; //Statement (declaracion) public static int numFilas; static final String sqlQuery = "SELECT id as ID, descripcion as DESCRIPCION, round(valor, 2) AS PRECIO FROM productos";//consulta static String insertSQL; //Metodo para Ejecutar la Cadena de consulta para la DB public static void establecerConsulta(String consulta) throws SQLException, IllegalStateException { if(!A_Conexion.DBConectado) //Asegurarse de la conexion throw new IllegalStateException("No hay conexion con la DB"); resultado =st.executeQuery(consulta); //Ejecuta la consulta metaData = resultado.getMetaData(); //Obtiene la MEtaData resultado.last(); //recorre el ResultSet hasta el final numFilas = resultado.getRow(); //contamos las filas //B_Interface.tablaModelo.fireTableStructureChanged(); //esto va siempre en el tipo de tablas AbstractTableModel } //Insercion de nuevos registros public static void Insercion() { try { Statement st = DriverManager.getConnection(A_Conexion.URL).createStatement(); insertSQL = "INSERT INTO productos (descripcion, valor) VALUES(" + "'" + A_Interface.txtDescripcion.getText() + "', " + A_Interface.txtPrecio.getText() + ")"; st.execute(insertSQL); JOptionPane.showMessageDialog(null, "Registro Ingresado"); A_Interface.txtDescripcion.setText(""); A_Interface.txtPrecio.setText(""); System.out.println("" + insertSQL); //A_Interface.txtDescripcion.setFocusable(true); } catch(SQLException sqlEx) { System.out.println("Error tipo SQL -> Insert"); sqlEx.printStackTrace(); } catch(Exception ex) { System.out.println("Error general inesperado"); } A_Interface.tabla.repaint(); //refrescamos el control JTable } }
Y ESTA ES LA INTERFACE QUE SE VISUALIZA:
Código Javascript:
Ver original
public class A_Interface extends JFrame implements ActionListener, KeyListener {//Estos son los componentes del Frame public static A_Tabla tablaModelo; static JTable tabla; public static JTextField txtDescripcion, txtPrecio; private static JLabel lblDescripcion, lblPrecio; private static JButton btnExec; //Esto lo EJECUTO ASI PARA llamarlo y tratar de refrescar el Jtable //Ejecutar una consulta para ver los registros public static void Ejecutor() { try {//Aqui creo la tabla, basandome en el constructor creado en A_Tabla tablaModelo = new A_Tabla(A_Conexion.controladorJDBC, A_Conexion.URL, A_SentenciasSQL.sqlQuery); tabla = new JTable(tablaModelo); } catch(ClassNotFoundException cnfEx) { System.out.println("No se pudo encontrar la clase"); JOptionPane.showMessageDialog(null, "No se encontro el controloador de la DB", "Problema con el controlador", JOptionPane.ERROR_MESSAGE); System.exit(1); } catch(SQLException sqlEx) { System.out.println("Excepcion de tipo SQL en la consulta y conexion basica"); JOptionPane.showMessageDialog(null, sqlEx.getMessage(), "Error con la DB", JOptionPane.ERROR_MESSAGE); A_Conexion.desCxDB(); System.exit(1); } } //Metodo constructor public A_Interface() { //Aki ponemos los componentes graficos sobre la ventana //Los botones, los textBoxes, etc ......... } //Insersion con un BOTON public void actionPerformed(ActionEvent ae) { if(ae.getSource() == btnExec) A_SentenciasSQL.Insercion(); //Ejecuto la insersion Ejecutor(); //COMO VEMOS AQUI VUELVO A EJECUTAR LA CONSULTA, PARA TRATAR DE REFRESCAR EL JTable AL EJECUTAR LA CONSULTA NUEVAMENTE, PERO NO FUNCIONA, ESTE ES EL DILEMA } //Ejecucion public static void main(String[] args) { Ejecutor(); JFrame.setDefaultLookAndFeelDecorated(true); new A_Interface(); } }
He usado fireTableStructureChanged(), repaint() y lo que hago es ejecutar de nuevo la consulta, y busco cargarla nuevamente en el JTable, pero no pasa nada.
Solo se aprecia el cambio si vuelvo a ejecutar la aplicación.
No se como limpiar un AbstractTableModel, he revisado la documentación y no tiene un método para borrar
REPITO: puedo realizar la inserción en la DB, pero no puedo refrescar el JTable, por favor, alguien podría darme un consejo?
gracias