Siempre vi que habían ventajas en usar un ArrayList como modelo de un JTable y heredando de un AbstractTableModel, lo pongo aquí para cuando alguien lo necesite hacer de esta forma.
package modelo;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class ModeloTabla extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private ArrayList<Object[]> data;
private String[] columnNames;
public ModeloTabla(ArrayList<Object[]> data, String[] columnNames) {
this.data = data;
this.columnNames = columnNames;
}
public ModeloTabla(String[] columnNames) {
this.data = new ArrayList<Object[]>();
this.columnNames = columnNames;
}
public ArrayList<Object[]> getdata(){
return this.data;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int columnIndex) {
return columnNames[columnIndex];
}
@Override
public Class<?> getColumnClass(int columnIndex){
return getValueAt(0,columnIndex).getClass();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return data.get(rowIndex)[columnIndex];
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
data.get(rowIndex)[columnIndex] = aValue;
fireTableDataChanged();
}
public void addRow(Object[] rowData) {
int rowIndex = data.size();
data.add(rowData);
fireTableRowsInserted(rowIndex, rowIndex);
}
public void removeRow(int rowIndex) {
data.remove(rowIndex);
fireTableRowsDeleted(rowIndex, rowIndex);
}
}