JTable 的 model(資料) 與view(視圖)是分開的兩個東西
在排序或者過濾之前,model跟view的狀態是一樣的
不過在排序或者過濾之後,view就會依照使用的情況而改變,model是不會變的
但是如果使用者要修改資料的話,必須從model來進行修改,此時如果直接採用view的座標來修改資料,就會出錯
例如:
原資料(model) | 排序後(view) |
5 3 1 2 4 |
1 2 3 4 5 |
如果只是要對Table的選擇做監聽,在監聽處理時使用table.getSelectedRow()就可以直接得到選中的索引
但如果是要對修改資料做監聽,就要用TableModelEvent來監聽,而且在觸發修改時,table.getSelectedRow()有可能不是你想要的
因為如果使用者是藉由"選取別行"來終止編輯,然後觸發TableModelEvent的話,取得選取行就不會是修改的行
此時就必須要用到TableModelEvent來取得改變的Model的row,再用JTable底下的convertRowIndexToView()來把回傳的值轉換成view的位置
如果使用者對排序後的資料3做修改,用TableModelEvent的getFirstRow()來取得row的話
就會取得到row=2,不過model紀錄的3是在row=3,而不是row=2
如果想要做正確的操作,一定要分清楚取得的資料是model還是view
取得的資料是model的話,就要用tableModel.getValueAt(...) 或tableModel.setValueAt(...) 等等
取得的資料是view的話,就要用table.getValueAt(...) 或table.setValueAt(...) 等等
想要在之間做轉換的話,使用以下方法,或自行舉一反三即可
(e 是 TableModelEvent 物件)
將 int row = e.getFirstRow();
改為 int row = convertRowIndexToView(e.getFirstRow());
留言列表