Gracias Gilberto, hace unos minutos que acabo de resolverlo y al entrar a contestarme a mi mismo veo tu respuesta, lo que he hecho es lo siguiente:
He definido el metodo "nuevaFila()" en class "MyTableModel extends AbstractTableModel":
public void nuevaFila() {
Object[][] datos = new Object[getRowCount()+1][getColumnCount()];
for (int i=0; i<getRowCount(); i++)
datos[i] = data[i];
data = datos ;
}
"data" es el Object[][] que contiene los datos en MyTableModel
"datos" es un nuevo Object[][] donde se copian los datos de "data" y que se crea con una fila mas que "data" y las mismas columnas.
Finalmente se copia "datos" en "data", con ello se consigue que "data" tenga una fila mas con los datos en blanco que se actualiza con el metodo setValueAt de MyTableModel.
Me parece poco eficiente que para cada registro que quiera añadir tener que copiar todos los datos en un array para añadir una fila y de nuevo copiar este nuevo array sobre el que contiene los datos del TableModel y luego actualizar la nueva fila con setValueAt, existe una manera mejor de hacerlo?
Muchas gracias.
Este es el codigo completo:
import java.sql.*;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.awt.event.*;
public class TableDemo extends JFrame {
private boolean DEBUG = true;
private static Connection con;
private static ResultSet rsJornada;
private static MyTableModel myModel;
public TableDemo() {
super("TableDemo");
myModel = new MyTableModel();
JTable table = new JTable(myModel);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane, BorderLayout.CENTER);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
class MyTableModel extends AbstractTableModel {
final String[] columnNames = {"Fecha","J 1 inicio","J 1 fin","J 1 sala",
"J 2 inicio","J 2 fin","J 2 sala","Horas",
"€ hora","Importe","Iva","Irpf","Total","Facturado"};
public Object[][] data = {};
public int getColumnCount() {return columnNames.length;}
public int getRowCount() {return data.length;}
public String getColumnName(int col) {return columnNames[col];}
public Object getValueAt(int row, int col) {return data[row][col];}
public void setValueAt(Object value, int row, int col) {data[row][col] = value;}
public void nuevaFila() {
Object[][] datos = new Object[getRowCount()+1][getColumnCount()];
for (int i=0; i<getRowCount(); i++)
datos[i] = data[i];
data = datos ;
}
}
public static void conectar() {
try
{
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=facturas.mdb";
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection (url, "", "");
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null,"\nError al conectar con la BD: \n" + e.getMessage()
+ "\n","Facturación",JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
public static void creartablajornada() {
Statement selectJornada = null;
try {selectJornada = con.createStatement(rsJornada.TYPE_SCROLL_SENSITIVE, rsJornada.CONCUR_UPDATABLE);}
catch (SQLException ex) {ex.printStackTrace();}
try {rsJornada = selectJornada.executeQuery("SELECT * FROM Jornada");}
catch (SQLException ex) {ex.printStackTrace();}
int i;
try {
while (rsJornada.next())
{
myModel.nuevaFila();
i = myModel.getRowCount()-1;
myModel.setValueAt(rsJornada.getDate("Fecha"),i,0);
myModel.setValueAt(rsJornada.getTime("J1inicio"),i,1);
myModel.setValueAt(rsJornada.getTime("J1fin"),i,2);
myModel.setValueAt(rsJornada.getInt("J1sala"),i,3);
myModel.setValueAt(rsJornada.getTime("J2inicio"),i,4);
myModel.setValueAt(rsJornada.getTime("J2fin"),i,5);
myModel.setValueAt(rsJornada.getInt("J2sala"),i,6);
myModel.setValueAt(rsJornada.getString("TThoras"),i,7);
myModel.setValueAt(rsJornada.getFloat("PrecioHora"),i,8);
myModel.setValueAt(rsJornada.getFloat("TTimporte"),i,9);
myModel.setValueAt(rsJornada.getFloat("ImporteIva"),i,10);
myModel.setValueAt(rsJornada.getFloat("ImporteIrpf"),i,11);
myModel.setValueAt(rsJornada.getFloat("TotalJornada"),i,12);
myModel.setValueAt(rsJornada.getBoolean("Facturado"),i,13);
}
}
catch (SQLException ex) {ex.printStackTrace();}
}
public static void main(String[] args) {
TableDemo frame = new TableDemo();
conectar();
creartablajornada();
frame.pack();
frame.setVisible(true);
}
}