JTable单元更新问题

时间:2014-04-17 19:47:31

标签: java swing jtable

我遇到了一个问题,我无法单独解决问题并在其他主题的帮助下解决问题。发现一些非常相似,但它没有帮助。

我认为我的问题很棘手,我会尽力解释这个问题。

所以,我得到了一个带有几列的JTable,第2列和第3列是可编辑的,第4列是这两列的产物(col4 = col2 * col3)。我要做的是当我编辑第2列或第3列时,第4列会自动更新它的值。我完成了但不完全。 仅当我通过鼠标点击完成编辑时,单元格才会更新。如果用ENTER键完成编辑,我希望单元格以相同的方式做出反应。

我正在尝试一下:

if(recipeTable.getCellEditor()!=null)recipeTable.getCellEditor().stopCellEditing();

但它并没有改变任何事情。

这是我的代码:

recipeTableModel = new DefaultTableModel(COLUMN_HEADLINE, 0) {

        @Override
        public boolean isCellEditable(int row, int column) 
        {
            model.updateTotalPriceInTable(recipeTable);
            return (column == 2) || (column == 3);
        }
    };

public void updateTotalPriceInTable(JTable table)
{
    double totalPrice;
    DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
    for(int i = 0; i < tableModel.getRowCount(); i++)
    {
        totalPrice = Double.parseDouble(tableModel.getValueAt(i, 2).toString()) * Double.parseDouble(tableModel.getValueAt(i, 3).toString());
        tableModel.setValueAt(totalPrice, i, 4);
    }
    tableModel.fireTableDataChanged();
}

~~~~~~~~~~~~~~~~~~~~~~~~ 好吧我明白了,那就是代码解决了我的问题:

@Override
        public void setValueAt(Object aValue, int row, int column)
        {
        Vector rowVector = (Vector)dataVector.elementAt(row);
        rowVector.setElementAt(aValue, column);
        rowVector.setElementAt(Double.parseDouble((String) rowVector.get(2))*Double.parseDouble((String) rowVector.get(3)), 4);
        fireTableDataChanged();
        }

1 个答案:

答案 0 :(得分:2)

覆盖TableModel的setValueAt(...)方法。您可以调用super.setValueAt(...)来正常保存数据。

然后,只要第2列或第3列中的数据发生变化,您就可以计算第4列的值并更新模型。