2011-02-17 78 views
1

我在JScrollPane中有一个JTable,数据来自数据库。单元格是可编辑的,我想将新值(编辑过的)保存到数据库中。问题是,getValueAt(row,col)返回旧的未编辑的值。如何从细胞中保存新值,而不是旧细胞?

这是从单元格中获取值并将它们插入到数据库中的代码。

 
    DefaultTableModel tableModel = (DefaultTableModel) table.getModel(); 
    int row = table.getEditingRow(); 
    if(row == -1) return -1; 
    String name = tableModel.getValueAt(row, 0).toString(); 
    String stringPrice = tableModel.getValueAt(row, 1).toString(); 
    float price = Float.parseFloat(stringPrice); 
    products.updateProduct(name, price); 
    ... 
    return 1; 

这里是我在的UpdateProduct(名称,价格)方法获得:代替

 
UPDATE products 
SET `prod_name` = 'OLD_NAME', `prod_price` = 'OLD_PRICE' 
WHERE `id` = 4 

 
UPDATE products 
SET `prod_name` = 'NEW_NAME', `prod_price` = 'NEW_PRICE' 
WHERE `id` = 4 

有可能是一个简单的解决方案,但我无法弄清楚。任何帮助表示赞赏。

+0

这是否经常或间歇发生?我在JTable中看到过这种行为:1)单击一个单元格,2)编辑它,3)点击“enter”或者直接点击其他地方。在步骤3)之前,表模型不会改变;虽然单元编辑器处于活动状态,但它不会将值传播到模型。 – iluxa 2011-02-17 23:25:53

+0

它总是发生......现在你提到“进入”,我试图打它,它的工作原理(我改变getEditingRow()getSelectedRow())后,但我必须打开回车,然后单击保存按钮。完成编辑后可以直接点击保存,而无需点击回车?无论如何感谢.. – radonys 2011-02-17 23:38:21

回答

1

不知道如何调用您的代码剪切,我猜你的问题是,单元格编辑器尚未停止,所以模型尚未用新数据更新。

您可以使用TableModelListener在单元格中的数据更改时收到通知。那么你可以保证模型中的数据是正确的。或者,如果您使用“保存”按钮来更新数据库,那么您需要阅读Table Stop Editing以解决您的问题。

+1

谢谢..我确实使用保存按钮。我读过你提到的文章,并使用table.putClientProperty(“terminateEditOnFocusLost”,Boolean.TRUE);作品。但是只有在第二个单元格编辑后,我点击保存按钮后,我编辑的第一个单元格不会失去焦点。这也很奇怪,但我会考虑一下。 – radonys 2011-02-17 23:55:05

-1

你可以实现自己的单元格编辑器,并在模型中使用的值的当前值,而如果它是活跃