我遇到了一个问题,我无法单独解决问题并在其他主题的帮助下解决问题。发现一些非常相似,但它没有帮助。
我认为我的问题很棘手,我会尽力解释这个问题。
所以,我得到了一个带有几列的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();
}
答案 0 :(得分:2)
覆盖TableModel的setValueAt(...)
方法。您可以调用super.setValueAt(...)来正常保存数据。
然后,只要第2列或第3列中的数据发生变化,您就可以计算第4列的值并更新模型。