TableModelEvent并将数据传递给控制器​​类和数据库

时间:2017-09-26 18:12:23

标签: java mysql swing jtable

道歉,如果这是基本的,或者我错过了什么,但我是自学而且不太确定这样做的最佳实践。

我正在尝试将我的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类,不幸的是它不是那么小。但我可以发布所需的任何课程。非常感谢任何建议!

0 个答案:

没有答案