Saludos....
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 originalpublic 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 originalpublic 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 originalpublic 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 originalpublic 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