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, comocatch(Exception ex) { ex.printStackTrace(); }
También debe
close
suConnection
s,Statement
s yResultSet
sDebe usar
PreparedStatement
lugar deStatement
, 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..