2011-02-17 96 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

你可以實現自己的單元格編輯器,並在模型中使用的值的當前值,而如果它是活躍