2012-05-08 53 views
1

我有一個擴展AbstractTableModel的表。當數據到達時,我刪除行並用新數據重新創建它們。我不明白的是爲什麼我調用下面:爲什麼我需要在fireTableRowsInserted()之前調用getRowSorter()。modelStructureChanged()

getRowSorter().modelStructureChanged(); 

調用

fireTableRowsInserted(); 

如果我不這樣做之前,fireTableRowsInserted()拋出我以下異常:

Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException: 1 
    at javax.swing.DefaultRowSorter.setModelToViewFromViewToModel(DefaultRowSorter.java:717) 
    at javax.swing.DefaultRowSorter.rowsInserted0(DefaultRowSorter.java:1046) 
    at javax.swing.DefaultRowSorter.rowsInserted(DefaultRowSorter.java:851) 
    at javax.swing.JTable.notifySorter(JTable.java:4258) 
    at javax.swing.JTable.sortedTableChanged(JTable.java:4106) 
    at javax.swing.JTable.tableChanged(JTable.java:4383) 
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280) 
    at javax.swing.table.AbstractTableModel.fireTableRowsInserted(AbstractTableModel.java:215) 
    at ems.ui.components.BoundTable$BoundTableModel.addRow(BoundTable.java:189) 
    at ems.ui.components.BoundTable.loadData(BoundTable.java:315) 
    at ems.ui.components.BoundTable.modelChanged(BoundTable.java:333) 
    at ems.model.BaseDataModel.notifyPropertyChange(BaseDataModel.java:541) 
    at ems.model.BaseDataModel.listLoadedFully(BaseDataModel.java:456) 
    at 
    at ems.network.HTTPProtobufPoller$2.run(HTTPProtobufPoller.java:107) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641) 
    at java.awt.EventQueue.access$000(EventQueue.java:84) 
    at java.awt.EventQueue$1.run(EventQueue.java:602) 
    at java.awt.EventQueue$1.run(EventQueue.java:600) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:611) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+1

如果TableModel基於相關API中的標準數組類型實現者,那麼這個錯誤是不可能的,沒有辦法,沒有[SSCCE](http://sscce.org/ – mKorbel

+1

)刪除行後的適當事件? – Robin

+0

是的,我打電話給fireTableDataChanged() – Misha

回答

2

如果您重新創建整個表(刪除行然後重新插入它們),您需要至少調用'fireTableDataChanged'(如果您懶惰並且不想告訴模型到底發生了什麼變化,只是想重新計算一切:-)。

'fireTableRowsInserted'只能在將數據附加到表模型時使用(即不要從表模型中刪除數據)。

+0

其實我通過在插入所有行後觸發fireTableDataChanged來實現我所期望的。所以我可以刪除這些不必要的代碼。我會接受這個答案,但我仍然一直在質疑爲什麼我得到這個例外。 – Misha

+1

因爲您違反了AbstractTableModel合同。您刪除並插入了行,但是您觸發了一個事件,指示行僅插入了'fireTableRowsInserted()'。如果你想刪除並插入並觸發一個事件,至少需要調用'fireTableRowsUpdated(int firstRow,int lastRow)'。 'fireTableDataChanged'將始終工作,因爲這表示所有行都可能更改的模型。 'modelStructureChanged'也可以工作,因爲即使列定義可能已經改變,該模型也會告訴模型。 –

相關問題