studio programacion móviles libros libro desarrollo desarrollar curso aprende aplicaciones java swing ms-access jtable insert-update

java - móviles - manual de programacion android pdf



La fila INSERT no actualiza JTable en GUI (2)

"No puedo hacer que mi JTable se actualice con una nueva fila a menos que reinicie el programa".

Creo que lo que estás esperando es que cuando la tabla de la base de datos se actualice, tu JTable lo haga. Realmente no funciona así. TableModel actualizar TableModel , y la JTable se actualizará automáticamente

Dado que resultSetToTableModel devuelve un DefuaultTableModel , puede usar cualquiera de los dos métodos de DefaultTableModel :

  • public void addRow(Object[] rowData) - Agrega una fila al final del modelo. La nueva fila contendrá valores nulos a menos que se especifique rowData. Se generará la notificación de la fila que se agrega.

  • public void addRow(Vector rowData) - Agrega una fila al final del modelo. La nueva fila contendrá valores nulos a menos que se especifique rowData. Se generará la notificación de la fila que se agrega.

Entonces, cuando agregue los datos a la base de datos, también querrá actualizar el DefaultTableModel como este

public static void addGenre(Integer a, String b){ ... rowsAdded = stmt.executeUpdate(query); if (rowsAdded > 0) { DefaultTableModel model = (DefaultTableModel)tab1.getModel(); model.addRow( new Object[] { a, b }); } }

También me di cuenta de que cambié la firma del método a Integer lugar de int por lo que encajará con el Object[] pasado a addRow . El int que pases recibirá autoboxed a Integer

NOTAS LATERALES

  • No te tragues la excepción al no poner nada en el bloque catch . Pon algo significativo que te avise de cualquier excepción que pueda ocurrir, como

    catch(Exception ex) { ex.printStackTrace(); }

  • También debe close su Connection s, Statement s y ResultSet s

  • Debe usar PreparedStatement lugar de Statement , para evitar la inyección de SQL.

Como mencioné en el encabezado, no puedo hacer que mi JTable se actualice con una nueva fila a menos que reinicie el programa. Cuando reinicio, la nueva fila está allí y todo está como debería. He intentado revalidar / volver a pintar el panel y el marco, probé los métodos de disparo. Estoy perdido Gracias por adelantado

ActionListener (en la clase adminGUI) para el botón ''Agregar'':

if(source.equals(add2)){ String c = itb.getText(); int a = main.getResults(); boolean matches = Pattern.matches("[A-Z][a-z]+", c); if(matches == true){ main.addGenre(a, c); }

Método de cadena (en la clase principal) para agregar una fila a la tabla de la base de datos:

public static void addGenre(int a, String b){ int rowsAdded; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection connect =DriverManager.getConnection("jdbc:odbc:MovieDB"); Statement stmt = connect.createStatement(); String query = "INSERT INTO Genres (genre_id, genre_name)" + "VALUES(" + a + ", ''" + b + "'')"; rowsAdded = stmt.executeUpdate(query); }catch(Exception exc){} }

Método (también en la clase principal) para incrementar la columna de clave de incremento automático:

public static int getResults(){ int a = 0; ResultSet ints = main.getResults("Select genre_id from Genres"); try { while(ints.next()){ int d = ints.getInt("genre_id"); if(d>a){ a = d; } a++; } } catch (SQLException ex) { Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); } return a; }

Detalles de JTable:

ResultSet rs1 = main.getResults("Select * from Genres"); JTable tab1 = new JTable(DbUtils.resultSetToTableModel(rs1));

Detalles de DbUtils.resultSetToTableModel:

public class DbUtils { public static TableModel resultSetToTableModel(ResultSet rs) { try { ResultSetMetaData metaData = rs.getMetaData(); int numberOfColumns = metaData.getColumnCount(); Vector columnNames = new Vector(); // Get the column names for (int column = 0; column < numberOfColumns; column++) { columnNames.addElement(metaData.getColumnLabel(column + 1)); } // Get all rows. Vector rows = new Vector(); while (rs.next()) { Vector newRow = new Vector(); for (int i = 1; i <= numberOfColumns; i++) { newRow.addElement(rs.getObject(i)); } rows.addElement(newRow); } return new DefaultTableModel(rows, columnNames); } catch (Exception e) { e.printStackTrace(); return null; } }

}


private void resetListData() throws ClassNotFoundException, SQLException { Connection cne = null; try { Class.forName("org.sqlite.JDBC"); cne = DriverManager.getConnection("jdbc:sqlite:table.sqlite"); cne.setAutoCommit(false); PreparedStatement psd = (PreparedStatement) cne.prepareStatement("Select * from Genres"); psd.execute(); ResultSet r = psd.getResultSet(); ResultSetMetaData rsmd = r.getMetaData(); int count = rsmd.getColumnCount(); String[] meta = new String[count]; for (int i = 0; i < count; i++) { String name = rsmd.getColumnName(i + 1); meta[i] = name; //System.out.println(name); } model = new DefaultTableModel(new Object[][]{}, new String[]{"name", "address"}); jTable1.setModel(model); while (r.next()) { Object[] row = new Object[count]; for (int i = 1; i <= count; ++i) { row[i - 1] = r.getString(i); // Or even rs.getObject() } model.addRow(row); } cne.close(); } catch (ClassNotFoundException | SQLException e) { } }

Usa este código para que pueda insertar una fila al final de Jtable sin reiniciar la aplicación.

Gracias..