道歉,如果这是基本的,或者我错过了什么,但我是自学而且不太确定这样做的最佳实践。
我正在尝试将我的JTable中更改的数据(用户在TableModel中手动编辑调用setValueAt()的单元格)传递给Controller:
@Override
public void setValueAt(Object value, int row, int col){
Person person = data.get(row); // Data is a simple arraylist underlying the model
switch(col){
case 1 : person.setTitle((String)value);break;
case 2 : person.setFName((String)value);break;
case 3 : person.setMName((String)value);break;
case 4 : person.setSName((String)value);break;
}
this.fireTableCellUpdated(row,col);
}
所以我使用来自Controller的setter和一个抽象类在JTable中设置了一个TableModelListener:
class PersonTable extends JTable{
private PersonTableModel pTableModel;
private TableModelListener tml;
public PersonTable(){
pTableModel = new PersonTableModel();
setModel(pTableModel);
setFillsViewportHeight(true);
}
public void setTableModelListener(TableModelListener tml){
pTableModel.add(tml);
}
}
从Controller类设置ModelListener:
personTable.setTableModelListener(new TableModelListener(){
@Override
public void tableChanged(TableModelEvent e) {
Person p = ((PersonTableModel)e.getSource()).getPerson(e.getFirstRow());
switch(e.getType()){
case TableModelEvent.UPDATE : model.updatePerson(p.getId(), e.getColumn()); // un-written method
}
}
});
我现在专注于那个switch语句。我可以从更改的行访问Object,以及在该行中更改的列索引。我还没有编写updatePerson(int, int)
方法和生成的SQL,但这对我来说似乎很脆弱。我已经知道我会遇到问题,因为我的JTable不包含数据库所做的每一列 - 所以列号不对应。
我认为我可以将所有数据库列添加到我的TableModel中,然后将它们从JTable中删除,这听起来可能会解决问题,但我宁愿从TableModelEvent获取更多信息。像我可以在交换机中使用的头信息,然后是SQL WHERE子句。
很抱歉,如果这还不够清楚的话。我有一个SSCCE,但是对于TableModel,Table和Person类,不幸的是它不是那么小。但我可以发布所需的任何课程。非常感谢任何建议!