我将创建一个实现TableModel和TableModelListener的tablemodel类,它不是特定于每个实体的 因为getValueAt()方法将为特定实体编写,并且 如果有可能我会为所有不同的实体编写一种方法。 我的TableModel是这样的:
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
}
问题在于,在我的数据库中有大约50个或更多的表,每个表都由一个实体类映射,并且每个表都在一个Jtable中具有rappresent,因此具有不同的tablemodel。 嘿,你可以看到必须为每个实体重写一些方法,因为每个实体都有他的getter和setter方法。在使用实体之前,数据在列表或数组中以二维方式映射,以便检索您必须执行的sigle数据: 阵列[行] [山口] 所以
public Object getValueAt(int rowIndex, int columnIndex) {
return result[rowIndex][columnIndex];
}
通过这种方式,我的表模型适用于每个表。