close

JTable 的 model(資料) 與view(視圖)是分開的兩個東西

在排序或者過濾之前,model跟view的狀態是一樣的

不過在排序或者過濾之後,view就會依照使用的情況而改變,model是不會變的

但是如果使用者要修改資料的話,必須從model來進行修改,此時如果直接採用view的座標來修改資料,就會出錯

例如:

原資料(model) 排序後(view)










如果只是要對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());

arrow
arrow

    yaya741228 發表在 痞客邦 留言(0) 人氣()