i would create a tablemodel class that implements TableModel and TableModelListener and its not specific for every entity cause the method getValueAt() will be written for specific entity, and if it possible i would write one method for all different entities. My TableModel is like this:
public class StabiliTableModel implements TableModel, TableModelListener{
protected EventListenerList listenerList = new EventListenerList();
private final EntityManager em;
private final TypedQuery<Stabili> qry;
private final List<Stabili> results;
private boolean addRowSwitch;
public StabiliTableModel(EntityManager em){
addRowSwitch = true;
this.em = em;
qry = em.createNamedQuery("findAll",Stabili.class);
results = qry.getResultList();
}
public int addBlankRow(){
if (addRowSwitch){
addRowSwitch = false;
results.add(new Stabili());
//fireTableRowsInserted(results.size() - 1, results.size() - 1);
fireTableDataChanged();
return results.size();
}
return 0;
}
@Override
public int getRowCount() {
return results.size();
}
@Override
public int getColumnCount() {
return 5;
}
@Override
public String getColumnName(int columnIndex) {
switch (columnIndex){
case 0:
return "Id";
case 1:
return "Denominazione";
case 2:
return "Indirizzo";
case 3:
return "Cap";
default:
return "Città";
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return getValueAt(0, columnIndex).getClass();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex != 0;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex){
case 0:
return results.get(rowIndex).getId();
case 1:
return results.get(rowIndex).getDenominazione();
case 2:
return results.get(rowIndex).getIndirizzo();
case 3:
return results.get(rowIndex).getCap();
case 4:
return results.get(rowIndex).getCitta();
default:
return null;
}
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
//fireTableCellUpdated(row, col);
switch (columnIndex){
case 1:
if(!aValue.equals(results.get(rowIndex).getDenominazione())){
results.get(rowIndex).setDenominazione(aValue.toString());
fireTableRowsUpdated(rowIndex,columnIndex);
}
break;
case 2:
if(!aValue.equals(results.get(rowIndex).getIndirizzo())){
results.get(rowIndex).setIndirizzo(aValue.toString());
fireTableRowsUpdated(rowIndex,columnIndex);
}
break;
case 3:
if(!aValue.equals(results.get(rowIndex).getCap())){
results.get(rowIndex).setCap(aValue.toString());
fireTableRowsUpdated(rowIndex,columnIndex);
}
break;
case 4:
if(!aValue.equals(results.get(rowIndex).getCitta())){
results.get(rowIndex).setCitta(aValue.toString());
fireTableRowsUpdated(rowIndex,columnIndex);
}
}
}
@Override
public void addTableModelListener(TableModelListener l) {
listenerList.add(TableModelListener.class, l);
}
@Override
public void removeTableModelListener(TableModelListener l) {
listenerList.remove(TableModelListener.class, l);
}
@Override
public void tableChanged(TableModelEvent e) {
System.out.println("Tipo di evento:"+ e.getType());
if(addRowSwitch){
switch(e.getType()){
case TableModelEvent.UPDATE:
em.getTransaction().begin();
em.getTransaction().commit();
break;
}
}
}
........
managing of events
}
The problem is this, in my db there are about 50 and more tables, every of one is mapped by an entity class, and every of one has rappresented in a Jtable so has un different tablemodel. Hew you could see some methods have to be re-written for every one entity, cause every entity has his getter and setter methods. Before the use of entities the data where mapped in list or array bi-dimensional so to retrive the sigle data you have to do : array[row][col] so
public Object getValueAt(int rowIndex, int columnIndex) {
return result[rowIndex][columnIndex];
}
In this way my table model is good for every tables.